编译器的行为是必需的,以避免不安全的操作,但可以通过使用闭包来绕过此错误。例如,考虑以下代码:
struct Foo {
x: i32,
y: i32,
}
impl Foo {
fn foo(&mut self) {
let f = || {
println!("x: {}, y: {}", self.x, self.y);
};
f();
}
}
fn main() {
let mut foo = Foo { x: 1, y: 2 };
foo.foo();
}
在 foo()
方法中,我们尝试以不可变方式访问 self
,但在可变引用期间无法这样做。解决方法是使用一个闭包,该闭包将 self
移动到其环境中,以便可以在不引起编译器错误的情况下对其进行不变访问。