如何复制str,而没有Copy trait?

问题描述 投票:0回答:1

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进行类似复制的行为?

rust traits primitive
1个回答
0
投票

"abc"more而不是just a str。它实际上是参考:

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

Playground

因此,我们不能直接查看str实现,而必须查看trait的&T (Reference)实现。

我们有一份复制内容:

&T

满足impl<'_, T> Copy for &'_ T where T: ?Sized; 。但是,由于&str的大小不定,因此我们无法隐式为其复制,因为它是字符串中的数据,而不是指向它的指针/引用/ str。因此,由于我们不知道要复制多少数据,因此无法对(size, ptr)进行按位Copy

© www.soinside.com 2019 - 2024. All rights reserved.