我是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的一部分,也没有告诉你函数在做什么。