HiD*_*der 9 generics clone rust
给定一个具有泛型的结构,Option<T>
其中T
可能无法实现Clone
为什么不能None
被克隆?aNone
的类型T
和其他的不一样None
吗?例如:
struct Foo<T> {
bar: Vec<Option<T>>,
}
impl <T> Foo<T> {
fn blank(size: usize) -> Foo<T> {
Foo {
bar: vec![None; size],
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于其他答案正确地指出了 ouf,这是由于vec!
-macro 的实现方式。您可以手动创建Vec
的任何Option<T>
不要求T
是Clone
:
let bar = std::iter::repeat_with(|| Option::<T>::None).take(size).collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
这将创建size
-number ofOption::<T>::None
并将它们放在 a 中Vec
,该 a 将预先分配到适当的大小。这适用于任何T
.
None
a of 类型T
与其他类型不一样吗None
?
当然不!与基于引用的语言不同,其中 null 通常在内部表示为空指针(地址为 0 的指针),RustOption<T>
不引入间接寻址,并且T
当选项为 时,内联存储Some
。由于所有枚举变体都具有枚举的类型,因此具有相同的大小,因此None
变体仍然必须至少占据与 一样多的空间T
。
话虽如此,从技术上讲,该None
值可以被克隆,而T
不仅仅是Clone
因为None
枚举的变体不包含T
,它只存储鉴别器并保留如果变体更改为 则可以包含的空间。但由于 Rust 枚举变体不是单独的类型,因此为枚举定义的特征边界必须涵盖所有变体。T
Some
请参阅其他答案,了解如何创建None
不可克隆的值向量的更详细的解释和说明Option
。
归档时间: |
|
查看次数: |
357 次 |
最近记录: |