这是我在 Rust 文档中看到的两个函数签名:
fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo } fn modify_foo(foo: &mut i32) { *foo += 1; *foo }
为什么 的位置不同mut?
mut
似乎第一个函数也可以声明为
fn modify_foo(foo: mut Box<i32>) { /* ... */ }
在 Rust 中,函数内签名的位置mut根据上下文具有不同的含义。
mut foo
foo
Box<i32>
Box
在第一个函数签名中fn modify_foo(mut foo: Box<i32>),mut foo表示绑定foo是可变的,这意味着您可以foo根据需要在函数内重新分配。它不会直接影响Box.
fn modify_foo(mut foo: Box<i32>)
在第二个函数签名中fn modify_foo(foo: &mut i32),&mut i32表示引用foo是可变的,这意味着它引用的数据(i32值)可以在函数内修改。
fn modify_foo(foo: &mut i32)
&mut i32
i32
因此,您提供的两个函数签名中的放置mut有不同的目的,并且它们不能直接互换。您建议的第三个函数签名fn modify_foo(foo: mut Box<i32>)不是有效的 Rust 语法,因为mut在类型之前使用,这在此上下文中是不允许的。
fn modify_foo(foo: mut Box<i32>)