小能豆

将“mut”放在变量名之前和“:”之后有什么区别?

rust

这是我在 Rust 文档中看到的两个函数签名:

fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo }
fn modify_foo(foo: &mut i32) { *foo += 1; *foo }

为什么 的位置不同mut

似乎第一个函数也可以声明为

fn modify_foo(foo: mut Box<i32>) { /* ... */ }

阅读 96

收藏
2024-05-21

共1个答案

小能豆

在 Rust 中,函数内签名的位置mut根据上下文具有不同的含义。

  1. mut参数名称 ( mut foo) 之前表示绑定本身是可变的。这意味着可以重新分配变量foo以引用函数内的不同值。
  2. mut类型 ( Box<i32>) 之前的 表示传递的值是可变的。这意味着引用指向的数据(或 拥有的数据Box)可以在函数内修改。

在第一个函数签名中fn modify_foo(mut foo: Box<i32>)mut foo表示绑定foo是可变的,这意味着您可以foo根据需要在函数内重新分配。它不会直接影响Box.

在第二个函数签名中fn modify_foo(foo: &mut i32)&mut i32表示引用foo是可变的,这意味着它引用的数据(i32值)可以在函数内修改。

因此,您提供的两个函数签名中的放置mut有不同的目的,并且它们不能直接互换。您建议的第三个函数签名fn modify_foo(foo: mut Box<i32>)不是有效的 Rust 语法,因为mut在类型之前使用,这在此上下文中是不允许的。

2024-05-21