所有primitive types in Rust人都实现了Copytrait 吗?

了解这一点会很有趣,因为这些知识肯定是彻底学习一门新编程语言的一部分.

推荐答案

我们可以使用编译器来证明某个东西是否实现了Copy.使用the list of primitives from The Rust Programming Language:

fn is_copy<T: Copy>() {}

fn main() {
    is_copy::<bool>();
    is_copy::<char>();
    is_copy::<i8>();
    is_copy::<i16>();
    is_copy::<i32>();
    is_copy::<i64>();
    is_copy::<u8>();
    is_copy::<u16>();
    is_copy::<u32>();
    is_copy::<u64>();
    is_copy::<isize>();
    is_copy::<usize>();
    is_copy::<f32>();
    is_copy::<f64>();
    is_copy::<fn()>();
}

还有其他一些我认为"原始"的类型:

  • 不可变引用(&T)
  • 可变引用(&mut T)
  • 原始指针(*const T/*mut T)

不可变引用始终实现Copy,可变引用从不实现Copy,原始指针始终实现Copy:

// OK
is_copy::<&String>();
is_copy::<*const String>();
is_copy::<*mut String>();
// Not OK
is_copy::<&mut i32>();

本书列表中还有其他几种类型:

  • 多元组
  • 数组

这些类型可以包含许多类型;它们在泛型上被参数化.如果包含的所有值均为Copy,则它们仅为Copy:

// OK
is_copy::<[i32; 1]>();
is_copy::<(i32, i32)>();
// Not OK
is_copy::<[Vec<i32>; 1]>();
is_copy::<(Vec<i32>, Vec<i32>)>();

切片有双重特殊性.切片类型本身([T])和字符串切片(str)是unsized种类型.很少看到它们没有某种间接指示,通常是参考(&[T]/&str).未调整大小的值不能单独存在.引用后面的版本的行为与引用类似.

// OK
is_copy::<&str>();
is_copy::<&[i32]>();
// Not OK
is_copy::<str>();
is_copy::<[i32]>();

和往常一样,documentation for a trait lists everything that implements that trait人.(有bugs in the documentation个时除外).

Rust相关问答推荐

从Type::new()调用函数

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

关于 map 闭合求和的问题

在文件链实施中绕过borrow 判断器

获取与父字符串相关的&;str的原始片段

如何获取光标下的像素 colored颜色 ?

可以在旋转循环中调用try_recv()吗?

Rust并发读写引起的死锁问题

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

trait 对象指针的生命周期

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

哪些特征通过 `Deref` 而哪些不通过?

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

通用类型,不同于输入类型,作为函数的返回值

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?

在传输不可复制的值时实现就地枚举修改

在同一向量 Rust 中用另一个字符串扩展一个字符串

来自外部函数的future 内部可变引用