“str
类型,也称为'string slice',是最原始的[强调]字符串类型。” (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"
不仅仅是str
。它实际上是一个引用:
fn name_of_val<T>(_: T) {
println!("{:?}", std::any::type_name::<T>());
}
name_of_val("abc");
//Prints "&str".
Playground。
因此,我们不能直接查看
str
实现,而必须查看traits的 &T
(Reference)实现。我们有一个副本隐含内容:
impl<'_, T> Copy for &'_ T
where
T: ?Sized;
这满足
&str
。但是由于str
没有大小,因此我们不能隐含复制,因为它是字符串中的数据,而不是指向它的指针/引用/(size, ptr)
。因此,我们无法对Copy
进行按位的 str
,因为我们不知道要复制多少数据。
关于rust - 如果str没有实现Copy trait,如何复制它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994765/