移动的函数参数上的 `mut` 是否会将实现细节泄漏到函数的 API?

cop*_*ton 4 rust

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

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

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

那么,说 amut和移动的参数实际上不是函数 API 的一部分是否正确?相反,它将该函数的实现细节泄露给它的签名。

感谢您帮助我更好地理解这一点。

问候,亚历克斯

Sve*_*ach 6

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

fn foo(s: String);
fn bar(mut s: String);
Run Code Online (Sandbox Code Playgroud)

is fn(String)– 绑定是否可变不是函数类型的一部分。由于类型在有和没有 的情况下被认为是相同的mut,因此mut不是 API 的任何有意义的部分。

另请注意,函数可以改变它获得所有权的任何值,无论相应的参数是否标记为mut。如果你有一个不可变的变量绑定,你总是可以将它移动到一个可变绑定中,例如

fn foo(s: String) {
    let mut s = s;
    s.push_str("glonk");
}
Run Code Online (Sandbox Code Playgroud)

因此mut,签名中的in 既不是 API 的一部分,也没有真正告诉您该函数在做什么。