は、私たちがこのようになります列挙型があるとします。Rustの列挙型フィールドを変更する簡単な方法はありますか?
enum MyEnum {
Field1,
Field2 {x: f64, y: f64},
/* Maybe some other fields */
MyString(String),
}
は今、私はサブタイプMyString
のこの列挙のインスタンスを作成し、いくつかのアクションの後、私はそれを変異させたいです。例えば:私たちはmy_enum
はのみMyString
することができ、コンテキストから正確に知っているとき
fn main() {
let mut my_enum = MyEnum::MyString("Hello, world".to_string());
/* Some actions */
// Mutating the string
match my_enum {
MyEnum::MyString(ref mut content) => {
content.push('!');
},
_ => {}
}
// Printing the string
match my_enum {
MyEnum::MyString(content) => {
println!("{}", content);
},
_ => {}
}
}
しかし、このように一致することはかなり面倒です。私は何かを行うことができます
[email protected] += 1.0;
:
[email protected]('!');
println!("{}", [email protected]);
と仮定し、もし、my_enum
は、サブタイプField2
であり、その後、x
を変異させる:私はむしろ、この(ない正しい錆構文)のようなものを書きますこのような?私は上記の試合から_ => {}
を削除する場合ので、私は強く、答えは「ノー」であると仮定し、型チェッカーは、非網羅的パターンマッチングに文句を開始:my_enum
はなく、何もないことを推測できるものの
patterns `Field1` and `Field2` not covered
MyString
。 "推論"とは、コンパイラがタイプMyEnum
のすべての変数を正確に含めることができる値のサブタイプを追跡できることを意味します。
このコードは便利な場所にありますが、他の方法で書き直すことができます。しかし、私はコンパイラがよりスマートになり、この文脈ではMyEnum::MyString
というパターンが網羅的であることを少なくとも理解すると思う。上記の質問に対する回答が本当に「いいえ」であると思われる場合は、この問題がRustの開発者(RFCSのリンクかもしれません)の間で議論されていて、機能要求を行う価値があるのであれば興味があります。
'MyEnum ::のMyString(REF MUTの内容を)聞かせている場合= my_enum {content.push( '!'); } ' – ildjarn