Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在铁锈中,什么';这两者之间的区别是什么;阴影“;及;易变性;?_Variables_Rust_Immutability_Mutability - Fatal编程技术网

Variables 在铁锈中,什么';这两者之间的区别是什么;阴影“;及;易变性;?

Variables 在铁锈中,什么';这两者之间的区别是什么;阴影“;及;易变性;?,variables,rust,immutability,mutability,Variables,Rust,Immutability,Mutability,在《变量与可变性》中,我们对这个主题进行了几次迭代,以演示Rust中变量的默认、不变行为: fn main() { let x = 5; println!("The value of x is {}", x); x = 6; println!("The value of x is {}", x); } 哪些产出: error[E0384]:无法将两次赋值给不可变变量`x` -->src/main.rs:4:5 | 2 |设x=5; | - |

在《变量与可变性》中,我们对这个主题进行了几次迭代,以演示Rust中变量的默认、不变行为:

fn main() {
    let x = 5;
    println!("The value of x is {}", x);
    x = 6;
    println!("The value of x is {}", x);
}
哪些产出:

error[E0384]:无法将两次赋值给不可变变量`x`
-->src/main.rs:4:5
|
2 |设x=5;
|         -
|         |
|对`x的第一次赋值`
|帮助:使此绑定可变:`mut x`
3 | println!(“x的值为{}”,x);
4 | x=6;
|^^^无法将两次赋值给不可变变量
但是,由于Rust对阴影变量的作用,我们可以简单地这样做来更改“不可变”x的值:

fn main() {
    let x = 5;
    println!("The value of x is {}", x);
    let x = 6;
    println!("The value of x is {}", x);
}
哪些输出(跳过详细信息):

x的值是5
x的值是6
有趣的是,此代码还生成上述两行作为输出,尽管我们不调用
let
,而是第一次
x
绑定到
5

fn main() {
    let mut x = 5;
    println!("The value of x is {}", x);
    x = 6;
    println!("The value of x is {}", x);
}
变量如何(并非真正)避免重新分配的模糊性似乎与保护绑定到不可变(默认情况下)变量的值的既定目标背道而驰。来自同一章(也包含阴影部分):

当我们试图修改时,得到编译时错误是很重要的 更改以前指定为不可变的值,因为 这种情况可能会导致错误。如果我们的代码有一部分在 一个价值永远不会改变的假设和我们的另一部分 代码更改了该值,可能代码的第一部分 不会做它被设计用来做的事。这种错误的原因可能是 事后难以追查,尤其是第二次 这段代码只是偶尔更改值

在Rust中,编译器保证当您声明 不会改变,它真的不会改变。这意味着当你 阅读和编写代码,您不必跟踪如何和 值可能会更改的位置。因此,您的代码更容易推理 通过


如果我可以通过对
let
的天真调用,使我的不可变
x
的这一重要功能被忽略,为什么我需要
mut
?有没有什么方法可以让
x
不可变,这样就没有
让x
可以重新分配它的值呢?

我认为混淆是因为你把名称和存储混为一谈了

fn main() {
    let x = 5; // x_0
    println!("The value of x is {}", x);
    let x = 6; // x_1
    println!("The value of x is {}", x);
}
在此示例中,有一个名称(
x
)和两个存储位置(
x_0
x_1
)。第二个
let
只是重新绑定名称
x
,以引用存储位置
x\u 1
x_0
存储位置完全不受影响

fn main() {
    let mut x = 5; // x_0
    println!("The value of x is {}", x);
    x = 6;
    println!("The value of x is {}", x);
}
在本例中,有一个名称(
x
)和一个存储位置(
x_0
)。
x=6
分配直接改变存储位置的位
x_0

你可能会争辩说,它们做同样的事情。如果是这样,你就错了:

fn main() {
    let x = 5; // x_0
    let y = &x; // y_0
    println!("The value of y is {}", y);
    let x = 6; // x_1
    println!("The value of y is {}", y);
}
这将产生:

y的值是5
y的值是5
这是因为更改
x
引用的存储位置绝对不会影响存储位置
x\u 0
,而
y\u 0
包含指向该位置的指针。但是,

fn main() {
    let mut x = 5; // x_0
    let y = &x; // y_0
    println!("The value of y is {}", y);
    x = 6;
    println!("The value of y is {}", y);
}
这无法编译,因为在借用时无法对
x_0
进行变异

正如通过参考文献观察到的那样,Rust关心的是防止不必要的突变效应。这与允许阴影并不冲突,因为阴影时并没有更改值,只是以其他地方无法观察到的方式更改了特定名称的含义。阴影是一种严格的局部变化


因此,是的,您完全可以避免更改
x
的值。您不能做的是阻止名称
x
所指的内容被更改。最多,你可以用一些东西来否认阴影。这是一个很好的答案,尤其是关于由于被借用而失败的部分。我等几天再接受。有没有办法打印链接到同一变量的所有值(即在本例中,如果我想看到x的所有x_I,在本例中是x_0和x_1)?@D8anija没有。没有人对表达式“不可变变量”感到震惊?它们不是反义词吗?