“ str
类型,也称为“字符串切片”,是最primitive [强调的]字符串类型。” (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
进行类似复制的行为?
"abc"
是more而不是just a str
。它实际上是参考:
fn name_of_val<T>(_: T) {
println!("{:?}", std::any::type_name::<T>());
}
name_of_val("abc");
//Prints "&str".
因此,我们不能直接查看str
实现,而必须查看trait的&T
(Reference)实现。
我们有一份复制内容:
&T
满足impl<'_, T> Copy for &'_ T
where
T: ?Sized;
。但是,由于&str
的大小不定,因此我们无法隐式为其复制,因为它是字符串中的数据,而不是指向它的指针/引用/ str
。因此,由于我们不知道要复制多少数据,因此无法对(size, ptr)
进行按位Copy
。