相关疑难解决方法(0)

在变量名之前和":"之后放置"mut"有什么区别?

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

fn modify_foo(mut foo: Box<i32>) { *foo += 1; *foo }
fn modify_foo(foo: &mut i32) { *foo += 1; *foo }
Run Code Online (Sandbox Code Playgroud)

为什么不同的位置mut

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

fn modify_foo(foo: mut Box<i32>) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

variables syntax reference mutable rust

51
推荐指数
3
解决办法
5734
查看次数

为什么Rust允许使用不可变绑定通过引用字段进行突变?

如果我有一个绑定到结构的不可变变量,Rust通常不允许我改变结构的字段或拥有的子结构的字段.

但是,如果该字段是一个可变引用,Rust 允许我改变引用的对象,尽管我的绑定是不可变的.

为什么允许这样做?它与Rust的不变性的正常规则不一致吗?

Rust 不会让我通过不可变引用做同样的事情,因此不可变引用具有与不可变引用不同的行为.

代码示例:

struct Bar {
    val: i32,
}

struct Foo<'a> {
    val: i32,
    bar: Bar,
    val_ref: &'a mut i32,
}

fn main() {
    let mut x = 5;

    {
        let foo = Foo { 
            val: 6, 
            bar: Bar { val: 15 },
            val_ref: &mut x
        };

        // This is illegal because binding is immutable
        // foo.val = 7;

        // Also illegal to mutate child structures
        // foo.bar.val = 20;

        // This is fine …
Run Code Online (Sandbox Code Playgroud)

rust

9
推荐指数
1
解决办法
834
查看次数

标签 统计

rust ×2

mutable ×1

reference ×1

syntax ×1

variables ×1