首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >把"mut“放在变量名之前和放在":”后面有什么区别?

把"mut“放在变量名之前和放在":”后面有什么区别?
EN

Stack Overflow用户
提问于 2015-02-18 23:46:54
回答 3查看 13.3K关注 0票数 96

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

代码语言:javascript
运行
复制
fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo }
fn modify_foo(foo: &mut i32) { *foo += 1; *foo }

为什么mut会有不同的位置

看起来第一个函数也可以声明为

代码语言:javascript
运行
复制
fn modify_foo(foo: mut Box<i32>) { /* ... */ }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-18 23:54:44

mut foo: T表示您有一个名为foo的变量,它是一个T。允许您更改变量引用的内容

代码语言:javascript
运行
复制
let mut val1 = 2;
val1 = 3; // OK

let val2 = 2;
val2 = 3; // error: re-assignment of immutable variable

这还允许您修改自己拥有的结构的字段:

代码语言:javascript
运行
复制
struct Monster { health: u8 }

let mut orc = Monster { health: 93 };
orc.health -= 54;

let goblin = Monster { health: 28 };
goblin.health += 10; // error: cannot assign to immutable field

foo: &mut T表示您有一个引用(&)值的变量,并且允许您更改(mut) 引用的值(如果它是一个结构,则包括字段):

代码语言:javascript
运行
复制
let val1 = &mut 2;
*val1 = 3; // OK

let val2 = &2;
*val2 = 3; // error: cannot assign to immutable borrowed content

请注意,&mut只有在引用的情况下才有意义- foo: mut T不是有效的语法。如果有意义,您还可以组合这两个限定符(let mut a: &mut T)。

票数 105
EN

Stack Overflow用户

发布于 2015-04-17 01:58:23

如果您来自C/C++,那么这样想可能也会有所帮助:

代码语言:javascript
运行
复制
// Rust          C/C++
    a: &T     == const T* const a; // can't mutate either
mut a: &T     == const T* a;       // can't mutate what is pointed to
    a: &mut T == T* const a;       // can't mutate pointer
mut a: &mut T == T* a;             // can mutate both

你会注意到这些是彼此相反的。C/C++采用“黑名单”方法,如果你想让某些东西是不可变的,你必须明确地说出来,而Rust采取“白名单”方法,如果你想让某些东西是可变的,你必须明确地说出来。

票数 122
EN

Stack Overflow用户

发布于 2021-05-24 22:59:59

下面的自然语言翻译似乎让我明白了……

代码语言:javascript
运行
复制
let x = value;
  x {binds immutably} to {immutable value}

let mut x = value;
  x {binds mutably} to {possibly mutable value}

let x = &value;
  x {binds immutably} to {a reference to} {immutable value}

let x = &mut value;
  x {binds immutably} to {a reference to} {mutable value}

let mut x = &value;
  x {binds mutably} to {a reference to} {immutable value}

let mut x = &mut value;
  x {binds mutably} to {a reference to} {mutable value}

哪里

  • {binds mutably}表示绑定可以为reassigned
  • {mutable value}表示值的内容可以更改
  • 您需要一个可变绑定来更改可变的值
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28587698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档