Rust 拥有的类型、复制特征和掉落特征 - 它们之间的关系

问题描述 投票:0回答:1

我对 Rust 中的 drop/copy 特征和所有权的关系有一些疑问。 最重要的问题:我如何知道某个类型是适用所有权规则的类型? 我最好的猜测是与缺乏复制特征有关。但我从未见过这种明确的说法。 这是真的?所以我的一般问题是:如果我有任务

let s=...
let t=s

之后如何知道 s 是否无效?它仅仅取决于复制特征的缺失吗?

此外,在教科书中,所有权总是通过使用具有 drop 特征的类型(例如 vec/String)来解释。这给人一种印象——我认为这是错误的——移动语义总是与掉落特征的存在联系在一起。但我想知道一个类型是否有必要具有 drop 特征才能遵循所有权规则?例如。 drop Trait 不只是变量超出范围时运行的一些清理代码吗?

最后一点:JoinHandle 类型缺少 drop 特征 - 但它被称为拥有类型。所以我想这表明这样一个事实:删除特征对于称为拥有类型的类型来说并不是必需的。但这就足够了吗?例如。所有具有 drop 特质的类型都是自有类型吗?

rust move
1个回答
0
投票

如果我有一个作业,我如何知道之后 s 是否无效?它仅仅取决于复制特征的缺失吗?

是的。不实现

Copy
特征的值是 moved;实现它的值是复制

但我想知道一个类型是否有必要具有 drop 特征才能遵循所有权规则?

不,不是。我猜所有权通常用

Drop
来解释,因为更容易解释为什么实现
Drop
的类型在移动后使用会出现问题(导致释放后使用或双重下降)。但也有一些未实现
Drop
的类型的用例,但它们代表某种无法复制的资源。

JoinHandle 类型缺少 drop 特征 - 但它被称为拥有类型。所以我猜这表明了这样一个事实:删除特征对于称为拥有类型的类型来说并不是必需的。

这实际上不是一个很好的例子,因为虽然

JoinHandle
(假设您指的是
std::thread::JoinHandle
)本身没有实现
Drop
,但它有一个滴胶。这是编译器自动生成的用于删除类型的“字段”的代码的名称。但正如我所说,总的来说你是对的。类型可能无法实现 Drop 但具有所有权语义。

但这就足够了吗?例如。所有具有 drop 特质的类型都是自有类型吗?

是的,因为
为某个类型实现

Drop 不允许为其实现

Copy

© www.soinside.com 2019 - 2024. All rights reserved.