在Rust中,是否可以指定分配的变量的可变性?例如:
在这种情况下,我要么尝试找出是否有人手动尝试将可变引用指向我的不可变
fn new(len: usize) -> Thing { ... }
fn new_mut(len: usize) -> mut Thing { ... }
我有一个特定的案例,需要知道一个类型的可变性,以便在我的数据结构下进行多种优化。
手动强制可变性是可能的,但似乎相当不雅,特别是当可变性的概念已经是 Rust 语言固有的一部分时。你最终会陷入奇怪的境地,就像这样:
// Thing::new() returns a data structure with an immutable backing type,
// but the code below looks like it should be mutable.
let mut foo = Thing::new(5);
在这种情况下,我要么尝试找出是否有人手动尝试将可变引用指向我的不可变
Thing
(并且可能会产生恐慌),要么通过使new
返回一个包装器覆盖了所有可变函数的Thing
来隐藏所有可变函数(这意味着mut
关键字变得毫无意义和误导性)。
Thing::new
返回一个不可变的_引用_。我不确定是否可能在不是引用类型的情况下编码可变性或不可变性。在我看来,像let mut foo = Thing::new(5);
中所见的可变性是变量的属性,而不是其类型的属性。因此,据我所知,写let a: mut u32 = 42;
是不可能的,因为会出现"expected type, found keywordmut
"的错误,但可变的_引用_是可以的。 - ForceBrulet mut foo = Thing::new(5);
中,我认为可变性是变量的属性,而不是其类型。这是正确的。此外,由于遮蔽的存在,可以在不改变变量的名称的情况下改变其可变性:let mut foo = Thing::new(5); do_something(&mut foo); let foo = foo;
是有效的。 - Cerberuslet foo = Thing::new(5); /* 这里 foo 是不可变的 */ ... let mut foo = foo; /* foo 不再是不可变的! */ ...
。 - user4815162342