19

我注意到在 Rust 中,移动应用于左值,并且静态强制不使用移动的对象。

这些语义与 Clean and Mercury 中的唯一性类型有什么关系?它们是同一个概念吗?如果不是,它们有何不同?

4

1 回答 1

12

Rust 中的所有权概念与 Mercury 和 Clean 中的唯一性概念不同,尽管它们是相关的,因为它们都旨在通过静态检查提供安全性,并且它们都是根据范围内的引用数量来定义的。主要区别在于:

  • 唯一性是一个更抽象的概念。虽然它可以解释为对内存位置的引用是唯一的,就像 Rust 的lvalues一样,它也可以应用于抽象值,例如宇宙中每个对象的状态,举一个极端但典型的例子。没有对应于这样一个值的指针——它不能在调试器或类似的东西中打开和检查——但它可以像任何其他抽象类型一样通过接口使用。目的是提供一种在有状态的情况下保持一致的面向价值的语义。

  • 至少在 Mercury 中(我不能代表 Clean),唯一性是一个比所有权更有限的概念,因为它必须有一个引用。您不能在不写入的条件下共享引用的多个副本,就像在 Rust 中所做的那样。您也不能借给写作参考,但在借款人完成后稍后再取回。

  • 在 Mercury 中声明独特的东西并不能保证会发生对引用的写入,只是编译器会检查这样做是否安全;实现复制唯一引用的内容而不是就地更新仍然有效。如果编译器认为它在其给定的优化级别上合适,它将安排适当的更新。或者,抽象类型的作者可以手动执行类似(或有时明显更好)的优化,安全地知道用户将被迫以与他们一致的方式使用抽象类型。另一方面,Rust 中的所有权与内存模型更直接相关,并为行为提供了更强的保证。

于 2014-10-16T18:58:31.497 回答