假設我們有一個看起來像這樣的枚舉:有沒有一種簡單的方法來突變Rust中的枚舉字段?
enum MyEnum {
Field1,
Field2 {x: f64, y: f64},
/* Maybe some other fields */
MyString(String),
}
現在我創造了這個枚舉亞型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);
},
_ => {}
}
}
然而,以這樣的方式匹配是相當繁瑣的,當我們從上下文準確地知道my_enum
可以只有MyString
。我寧願寫這樣的事情(不正確的鏽語法):
[email protected]('!');
println!("{}", [email protected]);
如果,假設,my_enum
是亞型Field2
的,然後發生變異x
:
[email protected] += 1.0;
我能做些什麼喜歡這個?我強烈地想,答案是「否」,因爲如果我刪除從上面的比賽_ => {}
,類型檢查開始抱怨非詳盡的模式匹配:
patterns `Field1` and `Field2` not covered
儘管它可以推斷my_enum
只能是MyString
。通過「推斷」,我的意思是編譯器可以跟蹤所有類型的變量MyEnum
它們可以精確包含哪些值的子類型。
我在一個更大的代碼中找到了一個可以方便使用的地方,但我想我可以用其他方法重寫它。不過,我認爲編譯器可能更聰明,並且至少要明白,在這種情況下,MyEnum::MyString
模式是詳盡無遺的。如果上述問題的答案真的是「否」,正如我懷疑的那樣,如果Rust開發人員討論了這個問題(也許是RFCS鏈接?),並且是否值得提出功能請求,我很感興趣。
'如果讓MyEnum :: MyString的(參考MUT含量)= {my_enum content.push( '!'); }' – ildjarn