我怎样才能使某些结构字段可变?
How can I make only certain struct fields mutable?
我有一个结构:
pub struct Test {
pub x: i32,
pub y: i32,
}
我想要一个函数来改变这个 — 简单:
pub fn mutateit(&mut self) {
self.x += 1;
}
这使得整个结构在 mutateit
的函数调用期间可变,对吗?我只想变异x
,不想变异y
。有什么方法可以可变地借用 x
?
引用 The Book:
Rust does not support field mutability at the language level, so you cannot write something like this:
struct Point {
mut x: i32, // This causes an error.
y: i32,
}
你需要内部可变性,这在 the standard docs:
中有很好的描述
use std::cell::Cell;
pub struct Test {
pub x: Cell<i32>,
pub y: i32
}
fn main() {
// note lack of mut:
let test = Test {
x: Cell::new(1), // interior mutability using Cell
y: 0
};
test.x.set(2);
assert_eq!(test.x.get(), 2);
}
而且,如果您想将它合并到一个函数中:
impl Test {
pub fn mutateit(&self) { // note: no mut again
self.x.set(self.x.get() + 1);
}
}
fn main() {
let test = Test {
x: Cell::new(1),
y: 0
};
test.mutateit();
assert_eq!(test.x.get(), 2);
}
我有一个结构:
pub struct Test {
pub x: i32,
pub y: i32,
}
我想要一个函数来改变这个 — 简单:
pub fn mutateit(&mut self) {
self.x += 1;
}
这使得整个结构在 mutateit
的函数调用期间可变,对吗?我只想变异x
,不想变异y
。有什么方法可以可变地借用 x
?
引用 The Book:
Rust does not support field mutability at the language level, so you cannot write something like this:
struct Point {
mut x: i32, // This causes an error.
y: i32,
}
你需要内部可变性,这在 the standard docs:
中有很好的描述use std::cell::Cell;
pub struct Test {
pub x: Cell<i32>,
pub y: i32
}
fn main() {
// note lack of mut:
let test = Test {
x: Cell::new(1), // interior mutability using Cell
y: 0
};
test.x.set(2);
assert_eq!(test.x.get(), 2);
}
而且,如果您想将它合并到一个函数中:
impl Test {
pub fn mutateit(&self) { // note: no mut again
self.x.set(self.x.get() + 1);
}
}
fn main() {
let test = Test {
x: Cell::new(1),
y: 0
};
test.mutateit();
assert_eq!(test.x.get(), 2);
}