你能在 Rust 中指定 return 类型可变性吗?

Can you specify return type mutability in 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 return Thing 的包装器,隐藏了所有可变函数(这意味着 mut 关键字变得毫无意义且具有误导性)。

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

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

您要查找的可能是专门用于优化的单独类型。