所有primitive types in Rust人都实现了Copy
trait 吗?
了解这一点会很有趣,因为这些知识肯定是彻底学习一门新编程语言的一部分.
所有primitive types in Rust人都实现了Copy
trait 吗?
了解这一点会很有趣,因为这些知识肯定是彻底学习一门新编程语言的一部分.
我们可以使用编译器来证明某个东西是否实现了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个时除外).