Size: a a a

2020 December 21

NB

Nik Bond in Rust Beginners
а, transmute...
источник

NB

Nik Bond in Rust Beginners
ну, по сути, с явным transmute такой же результат будет, не?
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
Допустим у меня есть два типа A и B, с разными методами но идентичным представлением в памяти.
struct A { first: i64, second: i64}
struct B { first: u64, second: u64}

Ну и я реализовал трейт impl From<A> for B.

Некая функция возвращает Vec<A>. Я могу превратить его в Vec<B> с .into_iter().map(), но тогда произойдет переалокация буффера.
Как мне сделать это in-place, ведь у меня структуры одинаковые с точки зрения занимаемой памяти? Сделать какой-нибудь .for_each() я тоже не могу, ведь нужно вернуть значение другого типа чем там было
А ты уверен, что получение знакового числа трансмьютом из беззнакового — это не UB?
источник

EG

Emmanuel Goldstein in Rust Beginners
Хотя кажется таки нет — для интов невалидные значения только полученные из неинициализированной памяти
источник

EG

Emmanuel Goldstein in Rust Beginners
Ну тогда просто трансмьют
источник

NB

Nik Bond in Rust Beginners
Emmanuel Goldstein
А ты уверен, что получение знакового числа трансмьютом из беззнакового — это не UB?
UB или нет - хз, но знаю что получится не то что хотел
источник

NB

Nik Bond in Rust Beginners
Ну тип, один и тот же набор байт в знаковом и безнаковом целом будет разные числа означать
источник

EG

Emmanuel Goldstein in Rust Beginners
Прям трансмьют всего вектора, собсна
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
Ну тип, один и тот же набор байт в знаковом и безнаковом целом будет разные числа означать
Ну, да
источник

EG

Emmanuel Goldstein in Rust Beginners
Ща
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
Ну тип, один и тот же набор байт в знаковом и безнаковом целом будет разные числа означать
А какое поведение ты хочешь? Что будет, если ты отрицательный i32 попытаешься перевести в u32?
источник

NB

Nik Bond in Rust Beginners
try_into() хочу)
Ну или напрямую панику на крайний случай
источник

NB

Nik Bond in Rust Beginners
мол, знаковый тип это требования ffi, в моем случае я знаю что отрицательное значение не прилетит
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
try_into() хочу)
Ну или напрямую панику на крайний случай
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
мол, знаковый тип это требования ffi, в моем случае я знаю что отрицательное значение не прилетит
https://docs.rs/vec-utils/0.3.0/vec_utils/trait.VecExt.html#tymethod.drop_and_reuse
Есть ещё вот такая кастомная библиотечная функция
источник

NB

Nik Bond in Rust Beginners
о, шикарно. Спс!
источник

EG

Emmanuel Goldstein in Rust Beginners
Nik Bond
мол, знаковый тип это требования ffi, в моем случае я знаю что отрицательное значение не прилетит
Или, если гарантируется, что значения меньше, чем i64::MAX и не бывают отрицательными, то можно просто transmute
источник

EG

Emmanuel Goldstein in Rust Beginners
Для чисел в диапазоне [0; i64::MAX] можно спокойно трансмьютить между i64 и u64, внутреннее представление будет одинаковым
источник
2020 December 22

MB

Mikail Bagishov in Rust Beginners
Да там и вне этого диапазона можно трансмьютить.
Значение либо не поменяется, либо изменится на 2^64
источник

ШН

Шерзод Немножко Токс... in Rust Beginners
Здравствуйте.

Есть функция parse, принимает data: &[u8]

И есть переменная body: Vec<u8>

Как правильнее передать эту переменную в функцию и в чём отличие?

1. parse(&body)
2. parse(body.as_slice());
3. parse(&body.as_slice());
4. ваш вариант
источник