より具体的な例がなければ、これで問題が解決するかどうかを判断するのは困難ですがref
、一致パターン内で を使用して、一致したサブ構造への参照を作成し、 を使用ref mut
してその参照を変更可能にすることができます。
したがって、あなたの例では:
enum State { Outside, InATag(~str) }
struct Tokenizer { state: State }
fn main() {
let mut t = Tokenizer { state: InATag(~"foo") };
match t.state {
InATag(ref mut _s) => { *_s = ~"bar"; }
Outside => { /* impossible */ }
}
io::println(fmt!("Hello World: %?", t));
}
または、トークナイザー状態の他の部分と一致させる必要がある場合は、これも機能します。
fn main() {
let mut t = Tokenizer { state: InATag(~"foo") };
match t {
Tokenizer { state: InATag(ref mut _s) } => { *_s = ~"bar"; }
Tokenizer { state: Outside } => { /* impossible */ }
}
io::println(fmt!("Hello World: %?", t));
}
この種のコードを実行する場合、エイリアシングが原因で誤ってボロー チェック違反が発生しやすいことに注意してください。たとえば、上記の 2 番目の例の比較的小さな変更はコンパイルされません。
fn main() {
let mut t = Tokenizer { state: InATag(~"foo") };
match &t {
&Tokenizer { state: InATag(ref mut _s) } => { *_s = ~"bar"; }
&Tokenizer { state: Outside } => { /* impossible */ }
}
io::println(fmt!("Hello World: %?", t));
}
rustc から次のメッセージが表示されます。
/tmp/m.rs:7:35: 7:46 error: illegal borrow: creating mutable alias to enum content
/tmp/m.rs:7 &Tokenizer { state: InATag(ref mut _s) } => { *_s = ~"bar"; }
^~~~~~~~~~~
error: aborting due to previous error
&t
の内部に変更可能なエイリアスを作成している間は、未処理の借用が必要ないためです。t