Я хочу преобразовать Vec<T>
в Vec<U>
, где T
- какой-то примитив, а U
- новый тип T
: struct U(T)
.
Я пробовал примерно так:
struct Foo(u32);
fn do_something_using_foo(buffer: &mut Vec<Foo>) {}
fn main() {
let buffer: Vec<u32> = vec![0; 100];
do_something_using_foo(&mut buffer as Vec<Foo>);
}
Я не хочу делать копию вектора, я хочу обернуть поля u32
в новый тип Foo
.
Это дает ошибку:
error[E0308]: mismatched types
--> main.rs:8:28
|
8 | do_something_using_foo(&mut buffer as Vec<Foo>);
| ^^^^^^^^^^^^^^^^^^^^^^^ expected mutable reference, found struct `std::vec::Vec`
|
= note: expected type `&mut std::vec::Vec<Foo>`
found type `std::vec::Vec<Foo>`
= help: try with `&mut &mut buffer as Vec<Foo>`
error: non-scalar cast: `&mut std::vec::Vec<u32>` as `std::vec::Vec<Foo>`
--> main.rs:8:28
|
8 | do_something_using_foo(&mut buffer as Vec<Foo>);
| ^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error(s)
std::mem::size_of
. 18.01.2018map_in_place()
. Причина его сложности заключалась в основном в том, что ему приходилось иметь дело с промежуточными состояниями, когда части вектора уже имеют типU
, а остаток по-прежнему имеет типT
. Сделать это правильно даже в случае паники довольно сложно. Если исходный и целевой типы имеют одинаковую структуру памяти, и вы хотите только переинтерпретировать память как другой тип, то это можно сделать относительно легко. 10.03.2019transmute
эквивалентен memcpy в C под капотом, поэтому я не думаю, что это удовлетворяет критериям без копирования вектора. Я упоминаю об этом, потому что это высокий результат Google по трансмутации ржавчины без копирования. 10.05.2021Vec<T>
. Данные не копируются. В противном случае вам понадобится что-то вроде преобразования 8 байтов&Vec<T>
, что все равно будет включать копирование этих 8 байтов. 10.05.2021T
. Означает ли это, что преобразование среза копирует только данные, составляющие жирный указатель, а не непрерывный массив данных, на который он указывает? 10.05.2021