你能在Rust中指定返回类型的可变性吗?
是否可以在 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手动对我的不可变对象进行可变引用(并且我认为是恐慌),或者通过new返回一个包装器Thing来隐藏所有可变函数(这意味着mut关键字变得毫无意义和误导性)。
回答
我认为您有一些误解:返回类型的可变性不是也不应该是函数签名的一部分,可变性始终由调用方决定。
返回类型是对执行函数后调用栈返回时返回给调用者的内存槽的描述。返回类型的所有权完全转移,例如 aThing完全转移到调用者。调用者如何处理返回的内存单元不是被调用函数关心的问题,因为它已经完成并返回。没有可变或不可变返回类型之类的东西,可变性总是与内存插槽相关。在您的示例中,这仅在声明变量时决定,该变量foo定义了调用方结果类型的内存槽。只要您拥有数据结构的完全所有权,您就可以自由决定甚至更改数据的可变性。
您正在寻找的可能是专门用于优化的单独类型。