如果一个 struct 的泛型为Option<T>,而T可能无法实现Clone,那么为什么不能克隆None呢?T型的None和其他None不一样吗?例如:

struct Foo<T> {
    bar: Vec<Option<T>>,
}

impl <T> Foo<T> {
    fn blank(size: usize) -> Foo<T> {
        Foo {
            bar: vec![None; size],
        }
    }
}

推荐答案

T型的None和其他None不一样吗?

绝对不是!与基于引用的语言不同,在基于引用的语言中,null通常被实现为null引用,而Rust's Option<T>不引入间接寻址,当选项为Some时,会以内联方式存储T.由于所有enum变量的大小相同,None变量必须至少占用T的空间.

话虽如此,从技术上讲,None值可以在T不为Clone的情况下克隆,这是正确的,因为枚举doesn'tNone变体包含T,如果变体更改为Some,它只存储鉴别器并保留could包含T的空间.但由于Rust enum变体不是单独的类型,因此为enum定义的特征边界必须覆盖所有变体.

参见其他答案更详细的解释和说明如何创建不可克隆OptionNone个值的向量.

Rust相关问答推荐

Rust kill std::processs::child

把Vector3变成Vector4的绝妙方法

无法在线程之间安全地发送future (&Q;)&错误

如何在原始字符串中转义";#和#";

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

通过使用光标拖动角来绕其中心旋转矩形

原始数组数据类型的默认trait实现

函数内模块的父作用域的访问类型

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

在1.5n次比较中找到整数向量中的最大和次大整数

从Rust 的临时文件中创建引用是什么意思?

判断 is_ok 后重用结果

TcpStream::connect - 匹配武器具有不兼容的类型

为什么这个值在上次使用后没有下降?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?