我对 Rust 中的 drop/copy 特征和所有权的关系有一些疑问。 最重要的问题:我如何知道某个类型是适用所有权规则的类型? 我最好的猜测是与缺乏复制特征有关。但我从未见过这种明确的说法。 这是真的?所以我的一般问题是:如果我有任务
let s=...
let t=s
之后如何知道 s 是否无效?它仅仅取决于复制特征的缺失吗?
此外,在教科书中,所有权总是通过使用具有 drop 特征的类型(例如 vec/String)来解释。这给人一种印象——我认为这是错误的——移动语义总是与掉落特征的存在联系在一起。但我想知道一个类型是否有必要具有 drop 特征才能遵循所有权规则?例如。 drop Trait 不只是变量超出范围时运行的一些清理代码吗?
最后一点:JoinHandle 类型缺少 drop 特征 - 但它被称为拥有类型。所以我想这表明这样一个事实:删除特征对于称为拥有类型的类型来说并不是必需的。但这就足够了吗?例如。所有具有 drop 特质的类型都是自有类型吗?
如果我有一个作业,我如何知道之后 s 是否无效?它仅仅取决于复制特征的缺失吗?
是的。不实现
Copy
特征的值是 moved;实现它的值是复制。
但我想知道一个类型是否有必要具有 drop 特征才能遵循所有权规则?
不,不是。我猜所有权通常用
Drop
来解释,因为更容易解释为什么实现 Drop
的类型在移动后使用会出现问题(导致释放后使用或双重下降)。但也有一些未实现 Drop
的类型的用例,但它们代表某种无法复制的资源。
JoinHandle 类型缺少 drop 特征 - 但它被称为拥有类型。所以我猜这表明了这样一个事实:删除特征对于称为拥有类型的类型来说并不是必需的。
这实际上不是一个很好的例子,因为虽然
JoinHandle
(假设您指的是std::thread::JoinHandle
)本身没有实现Drop
,但它有一个滴胶。这是编译器自动生成的用于删除类型的“字段”的代码的名称。但正如我所说,总的来说你是对的。类型可能无法实现 Drop
但具有所有权语义。
但这就足够了吗?例如。所有具有 drop 特质的类型都是自有类型吗?为某个类型实现是的,因为
Drop
不允许为其实现
Copy
。