rust - 你能在 Rust 中指定返回类型可变性吗?

标签 rust immutability

是否可以在 Rust 中指定赋值变量的可变性?有点像

fn new(len: usize) -> Thing { ... }
fn new_mut(len: usize) -> mut Thing { ... }

我有一个特定的案例,知道类型的可变性可以用来对我的数据结构进行一些底层优化。

尝试手动强制执行可变性是可能的,但似乎很不优雅,尤其是当可变性的概念已经是 Rust 语言的固有部分时。你最终会遇到这样的奇怪情况:

// Thing::new() returns a data structure with an immutable backing type, 
// but the code below looks like it should be mutable.
let mut foo = Thing::new(5);

在这种情况下,我要么必须选择尝试弄清楚是否有人试图手动对我的不可变 Thing 进行可变引用(我想是 panic ),要么通过制作 new 返回一个隐藏所有可变函数的 Thing 包装器(这意味着 mut 关键字变得毫无意义且具有误导性)。

最佳答案

我认为您有一些误解:返回类型的可变性不是也不应该是函数签名的一部分,可变性始终由调用方决定。

返回类型是函数执行后调用栈返回时返回给调用者的内存槽的描述。返回类型的所有权已完全转移,例如Thing 已完全移至调用方。调用者如何处理返回的内存单元不是被调用函数的关注点,因为它已经完成并返回了。没有可变或不可变返回类型之类的东西,可变性总是与内存槽有关。在您的示例中,这仅在声明变量 foo 时决定,该变量定义了调用方结果类型的内存槽。只要您拥有数据结构的完全所有权,您就可以自由决定甚至更改数据的可变性。

您正在寻找的可能是专门用于优化的单独类型。

关于rust - 你能在 Rust 中指定返回类型可变性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67361226/

相关文章:

HashSet 作为其他 HashSet 的键

reference - 在 Kotlin 中将 ArrayList 转换为 List 时的不变性问题

java - Guava ImmutableMap Builder 语法

multithreading - 在线程之间发送 Nalgebra VectorN

rust - 消费 self 并返回它对性能有何影响?

rust - 如何改变 PathBuf 的底层字符串?

xml - 为什么 XML 文字在 Scala 中产生可变对象?

java - 具有 ArrayList 成员变量的不可变对象(immutable对象) - 为什么可以更改此变量?

变量的 Java final 关键字

types - 我得到了一个预期的类型参数,尽管我认为我已经返回了正确的类型数据