Как можно скопировать str, если он не поддерживает черту копирования? - PullRequest
0 голосов
/ 31 января 2020

«Тип str, также называемый« строковым срезом », является наиболее примитивным [выделение добавлено] строковым типом.» (https://doc.rust-lang.org/std/primitive.str.html)

Интуитивно str, следовательно, должен быть копируемым, то есть:

fn main() {
    let _str = "hello";
    let _str2 = _str;

    println!("{}", _str); // Output: hello
}

Однако он не реализует черту Copy :

fn main() {
    is_copy::<str>(); // Compile time error: the trait std::marker::Copy is not implemented for str
}

fn is_copy<T: Copy>() {}

Что допускает подобное копирование с str?

1 Ответ

2 голосов
/ 31 января 2020

"abc" это больше , чем просто a str. На самом деле это ссылка:

fn name_of_val<T>(_: T) {
    println!("{:?}", std::any::type_name::<T>());
}
name_of_val("abc");
//Prints "&str".

Детская площадка .

Поэтому мы не можем смотреть на реализации str напрямую, вместо этого мы должны смотреть на &T (Справочник) Реализации черт.

У нас есть копия impl:

impl<'_, T> Copy for &'_ T
where
    T: ?Sized;

Это удовлетворяет &str. Но так как str не имеет размера, мы не можем включить его копирование, поскольку это данные в строке, а не указатель / ссылка / (size, ptr) на нее. Поэтому мы не могли бы сделать побитовое Copy из str, так как мы не знали бы, сколько данных скопировать.

...