rust - 如果str没有实现Copy trait,如何复制它?

标签 rust traits primitive

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/

相关文章:

scala - Scala : object or trait 中的策略更可取的是什么

scala - 使用抽象类而不是特征有什么好处?

scala - 在 Scala 中增加 Short 类型变量的最简洁方法是什么?

java - 如果我有一组独特的 Longs,如何获得一组独特的整数?

rust - 如何测试对象的其他特征函数

rust - 如何减少可变范围

rust - 当输出值不属于类型时如何实现 std::ops::Index

arrays - 在Rust中迭代2D数组的各个部分的最佳方法

rust - 如何将一个字段移出实现 Drop 特性的结构?

java - 这两种说法有什么区别吗?