如果 str 没有实现 Copy 特性,如何复制它?

dar*_*cts 6 primitive traits rust

“该str类型也称为‘字符串切片’,是最原始的[强调]字符串类型。” (https://doc.rust-lang.org/std/primitive.str.html

因此,直观上str应该是可复制的,它是:

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

    println!("{}", _str); // Output: hello
}
Run Code Online (Sandbox Code Playgroud)

但是,它没有实现以下Copy特征:

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

fn is_copy<T: Copy>() {}
Run Code Online (Sandbox Code Playgroud)

是什么允许这种类似复制的行为str

Opt*_*ach 8

"abc"不仅仅是一个​​ 其实是一个参考:str

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

游乐场

因此,我们不能str直接查看实现,而是必须查看特征的&T(参考)实现。

我们有一个复制实现:

impl<'_, T> Copy for &'_ T
where
    T: ?Sized;
Run Code Online (Sandbox Code Playgroud)

这就满足了&str。但由于str未调整大小,我们无法为其实现复制,因为它是字符串中的数据,而不是指向(size, ptr)它的指针/引用/。因此,我们无法执行按位Copy操作str,因为我们不知道要复制多少数据。