在 Rust 中,您可以升级一个不可变变量:
我想要一个变量在内存中保存这些值,且不希望它被后续的任何代码更改。如果我在某个时刻尝试更改此变量,则应该报错。这是我定义的约束条件。
如果稍后只需要执行以下操作:
使其可变并更改它,这似乎违背了不可变变量的整个目的。在那一点上,您可能会选择使所有变量可变(像Python一样),因为不可变性不能得到保证。不仅如此,程序员可能会对不可变性的保证产生错误的认识,并根据这种假设犯错。
至少对于常量,存在不可变性的保证。如果您可以随时将其变为可变的,则普通不可变变量的目的不清楚。
let v = Vec::new(); // Immutable
let mut v = v; // Mutable
v.push("hi"); // Succeeds
或者将可变变量降级:
let mut v = Vec::new(); // Mutable
let v = v; // Immutable
v.push("hi"); // Won't compile
我的问题是-为什么?
据我所知,用于存储变量值的底层内存从未是不可变的。技术上每个内存地址都可以被写入。不可变性是一种人为的限制,由某些人(例如内核)强加给我们,或者我们自己强加给自己。
当我说:
let v = vec!["a", "b", "c"];
我想要一个变量在内存中保存这些值,且不希望它被后续的任何代码更改。如果我在某个时刻尝试更改此变量,则应该报错。这是我定义的约束条件。
如果稍后只需要执行以下操作:
let mut v = v;
使其可变并更改它,这似乎违背了不可变变量的整个目的。在那一点上,您可能会选择使所有变量可变(像Python一样),因为不可变性不能得到保证。不仅如此,程序员可能会对不可变性的保证产生错误的认识,并根据这种假设犯错。
至少对于常量,存在不可变性的保证。如果您可以随时将其变为可变的,则普通不可变变量的目的不清楚。