Денис
ну или вот с модными impl'ами, которые тут все ненавидят :) https://play.rust-lang.org/?gist=28f44f1e72e1fdaae047c2daff34a386&version=nightly&mode=debug&edition=2015
Денис
выглядит адово честно говоря
Антон
Млин, что-то сразу не сообразил: .map(|x| x.borrow().clone())
Денис
хм
Денис
и как это поможет?
Денис
у склонированной ссылки будет точно такой же лайфтайм, не?
Cat
а он ссылку склонирует, не инстанс?
Антон
а он ссылку склонирует, не инстанс?
Смувает ссылку и клонирует то, на что она указывает
Денис
ну это зависит
Денис
https://gist.github.com/309e44c6a7fc29f2d99a51c2c7f75416
Денис
но если тип имплементит Clone, то тогда объект будет скопирован
Cat
а почему бы тогда просто не x.clone() ? или в этом и смысл?
Антон
Clippy, кстати, справедливо советует поменять на .map(|x| *x.borrow())
Денис
то есть ты на ровном месте собираешься склонировать объект, чисто ради удобной семантики, так?
Антон
а почему бы тогда просто не x.clone() ? или в этом и смысл?
Нет, потому что x принадлежит типу B, про который известно только то, что для него реализован типаж Borrow<(Idx, Idx, Float)>
Cat
да нет, я про сам смысл использовать Borrow, если клоним инстанс (но если it depends, то ок)
Денис
да нет, я про сам смысл использовать Borrow, если клоним инстанс (но если it depends, то ок)
чтобы можно было и объекты принимать, и ссылки на объекты
Cat
ок
Антон
да нет, я про сам смысл использовать Borrow, если клоним инстанс (но если it depends, то ок)
Я ж говорил, чтобы принимать и типы, конвертирующийся в итератор, отдающий кортеж, и тип, конвертирующийся в итератор, отдающий сссылки на кортежи
Антон
Ты б лучше ссылками на плейграунд
Ну пожалуйста: https://gist.github.com/AnthonyMikh/c610cf461bd1e25f10c4061c0bfe7753
Max
Эмм, что нормально, что cargo check не отображает ошибки (просто отписывает Finished dev [unoptimized + debuginfo] target(s) in 0.06s) Хотя ошибки точно есть
պլհկ
тачни файл
Max
А, понял, там кеш
Alexey
Следующий юбилейный
Loyd
Следующий юбилейный --- 1024
Loyd
Хотя.. "юбилейный" не очень правильное название здесь, ибо это "кратный основанию" (так, у маглов это каждые 10 лет)
Loyd
То есть у нас юбилей каждые 2 участника
Alexey
И это ещё раз подтверждает то, что 700-ый будет юбилейным)
Αλεχ
25 тоже юбилей
юбилеи по основанию 5 считаются
Αλεχ
5-10-15-20-25
Anonymous
То есть юбилеи идут кратно половине основания системы.
Anonymous
У нас тогда вообще каждый человек юбилейный.
Αλεχ
каждый день как праздник
Loo
Nikita
Нет повода не выпить
Αλεχ
короч вопрос такой
Αλεχ
как вот такое сделать?
Αλεχ
https://play.rust-lang.org/?gist=d70c4e1ee967c7133a51d790a1fb2d0d&version=stable&mode=debug&edition=2015
Αλεχ
если не делится без остатка, то дополнить нулями до границы
Cat
он хочет слайс фиксированной длины передать в функцию, принимающую array
Loo
https://play.rust-lang.org/?gist=99810648c7ff276d598c2da4201d0917&version=stable&mode=debug&edition=2015
Loo
https://intellij-rust.github.io/2018/06/20/changelog-76.html
պլհկ
ну сорян
Антон
let mut array: [u8; 32] = [0; 32]; array.copy_from_slice(slice)
This function will panic if the two slices have different lengths.
պլհկ
Loo
Найс фикс бро
я на самом деле не понял в чем проблема и автоматом пофиксил ошибку компиляции
Αλεχ
Есть сторонняя функция с сигнатурой foo
Αλεχ
Нужно напихать туда чанки нужной блины
Αλεχ
Если чанк меньше дополнить нулями
Αλεχ
Без копирования
Денис
меня больше смущает, что их без копирования надо нулями дополнить
Денис
мм
պլհկ
Но изначальная задача другая была 🤯
Adam
Ты без копирования нулями никак не дополнишь. Можно сделать проверку, если длинна >= 32, то ансейф каст. Если меньше, то делаешь на стеке массив, в него копируешь, дополняешь нулями.
Антон
Если чанк меньше дополнить нулями
Это не получится сделать. Слайс предполагает указатель на уже заранее выделенную память. Если у тебя вектор, то о значении памяти ты можешь говорить только в границах вектора. А если чанк неполный (т. к. выходит за границу вектора), то о содержимом памяти дальше неполного чанка у тебя никаких гарантий нет
Антон
Вот, спасибо. То же, ч то я написал, но короче
Αλεχ
ну текущий вариант такой: if slice.len() == 32 { let slice = unsafe{ slice.as_ptr() as *const _ as &[u8;32] }; pwasm_ethereum::write(&(base_address + index * size_in_buckets.into()).into(), slice); } else { let vec = Vec::with_capacity(32); vec.extend_from_slice(slice); let slice = unsafe{ vec.as_ptr() as *const _ as &[u8;32] }; pwasm_ethereum::write(&(base_address + index * size_in_buckets.into()).into(), slice); }
Αλεχ
но он не дает просто так кастануть *const в &[u8;32]
պլհկ
а чо там век, а не аррей
Αλεχ
можно и аррей
Αλεχ
первую ветку так и так надо заставить работать
Αλεχ
if slice.len() == 32 { let slice = unsafe{ slice.as_ptr() as *const _ as &[u8;32] }; pwasm_ethereum::write(&(base_address + index * size_in_buckets.into()).into(), slice); } else { let mut arr = [0u8; 32]; arr.copy_from_slice(slice); pwasm_ethereum::write(&(base_address + index * size_in_buckets.into()).into(), &arr); }
Αλεχ
м?
Alex
массив из массивов? )
Cat
вектор массивов
Αλεχ
и чем я его буду наполнять?
Αλεχ
я уже кастанул
Αλεχ
ошибка выше
Αλεχ
error[E0605]: non-primitive cast: `*const u8` as `&[u8; 32]` --> src\lib.rs:140:41 | 140 | let slice = unsafe{ slice.as_ptr() as *const _ as &[u8;32] }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
Αλεχ
проблема как из *const u8 получить &[u8; 32]
պլհկ
M E M :: T R A N S M U T E
Αλεχ
M E M :: T R A N S M U T E
трансмут тоже не получился