fn main() {
let funcs = {
// Можно использовать не FnOnce, а что-то другое. Например Fn или FnMut. Но в любом случае придётся использовать dyn, тк наша лямбда берёт что-то из окружающего контекста.
let mut funcs: Vec<Box<dyn FnOnce() -> usize>> = Vec::with_capacity(3);
for i in 0..3 {
let i_copy = i.clone(); // вообще clone() тут не нужен, тк usize реализует трейт Copy. Оставлено для примера
funcs.push(Box::new(move || i_copy));
}
funcs
};
for func in funcs {
let result = func();
println!("{result}");
}
}
#[derive(Copy, Clone, Debug)]
struct Something(usize);
impl Something {
fn value(&self) -> usize {
self.0
}
}
fn main() {
let items = {
let mut items = Vec::with_capacity(3);
for i in 0..3 {
items.push(Something(i));
}
items
};
for item in items {
let result = item.value();
println!("{result}");
}
}
Ведь нет какой-то волшебной операции вернуть владение
pushq %rbx
movq %rdi, %rbx
movq __rust_no_alloc_shim_is_unstable@GOTPCREL(%rip), %rax
movzbl (%rax), %eax
movl $5, %edi
movl $1, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB10_1
movb $114, 4(%rax)
movl $1701736041, (%rax)
movq %rax, (%rbx)
movq $5, 8(%rbx)
movq $5, 16(%rbx)
popq %rbx
retq
pushq %r14
pushq %rbx
pushq %rax
movq __rust_no_alloc_shim_is_unstable@GOTPCREL(%rip), %r14
movzbl (%r14), %eax
movl $5, %edi
movl $1, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB11_6
movq %rax, %rbx
movb $114, 4(%rax)
movl $1701736041, (%rax)
movzbl (%r14), %eax
movl $24, %edi
movl $8, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB11_2
movq %rbx, (%rax)
movq $5, 8(%rax)
movq $5, 16(%rax)
addq $8, %rsp
popq %rbx
popq %r14
retq
impl<T: Clone + Into<JsValue>> MyIntoJsValue for T {
fn into_jsvalue(&self) -> JsValue{
self.clone().into()
}
}
В wasm-bindgen::JsValue Нету impl From for JsValue
impl From<Element> for JsValue
Не работает. Работает только с &element
Тут тоже подвоха нет. get_element_by_id() возвращает Option<Element>, а не Option<&Element>
Но эти поганые макросы наносят уроны документации, и не видно какие именно есть поля и функции у JsValue.
fn() -> u8
- это указатель на функцию. В него можно записать или обычную функцию с подходящей сигнатурой или замыкание, которое ничего не замыкает:fn some_func() -> u8 {
0
}
let f: fn() -> u8 = some_func;
let f: fn() -> u8 = || 0;
fn main() {
let mut funcs = Vec::with_capacity(3);
for i in 1u8..=3 {
funcs.push(move || i);
}
for i in 0..3 {
println!("{}", funcs[i]());
}
}
std::ops::RangeInclusive::<u8>::new
const &y = x;
int
. Если в C код const y = x
является синтаксически верным и подразумевает const int y = x
, то в C++ этот же код является уже синтаксически неверным и не пройдет трансляцию.int arr[32] = {...};
size_t N = sizeof(arr) / sizeof(arr[0]);
&
тоже исключение. Просто я думал, зачем же нужен в enum valueOf(). Разобрался. Предположил, что метод хранит в себе строковое представление констант, а затем сравнивает вводные данные с ними.
public enum Hello {
FIZZ, BUZZ;
// Данный метод автоматически генерируется компилятором.
// Для любого enum'а.
public static Hello valueOf(String name) {
return Enum.valueOf(Hello.class, name);
}
}
Но так как я знаю, что константы в enum это анонимные классы
Получается мне действительно прийдется перекрывать эти переменные повторным объявлением для разрыва связи с предком?
Как безболезненно перейти с Python на Rust?
1) Python медленный
2) В python нет адекватного управления памятью
3) В python мне приходится испльзовать кучу мегабайт библиотек (я чувствую себя тупым и бесполезным при импортировании библеотек)
4) Python кажется игрушечным языком
5) Python не подходит род микроконтроллеры (micropython - просто игрушка)
6) Проблемы из-за GIL'а