移动的函数参数上的"mut"是否将实现详细信息泄漏到函数的 API?



我是Rust新手,刚刚阅读Rust编程书的第二版。我一直想知道下面的问题,但到目前为止还没有找到答案。

定义函数时,可以移动一些参数。如果您打算在函数内改变它们,也可以将它们声明为mut(不带引用)。

对于调用者来说,这个mut似乎没有任何意义。他们刚刚转移了所有权,在那之后数据会发生什么就不关他们的事了,对吧?

那么,是否可以说mut以及移动的参数实际上不是函数API的一部分?相反,它将该函数的实现细节泄露给了它的签名。

谢谢你帮助我更好地理解这个。

问候,亚历克斯

您是对的,mut不会以任何方式改变接口。这两个函数的函数指针类型

fn foo(s: String);
fn bar(mut s: String);

isfn(String)——绑定是否可变不是函数类型的一部分。因为无论有没有mut,这些类型都被认为是相同的,所以mut不是API的任何有意义的部分。

还要注意,一个函数可以改变它接收到的任何值的所有权,而不管相应的参数是否被标记为mut。如果你有一个不可变的变量绑定,你可以把它移到一个可变的绑定中,例如

fn foo(s: String) {
let mut s = s;
s.push_str("glonk");
}

所以签名中的mut既不是API的一部分,也没有告诉你函数在做什么。

最新更新