如果你只是想返回城市名沒有通過消耗失去了對象,你應該把它寫成如下:
enum CityType {
City { name: String },
Town { name: String },
Village { name: String },
}
impl CityType {
fn name(&self) -> &str {
match *self {
CityType::City { ref name } => name,
CityType::Town { ref name, .. } => name,
CityType::Village { ref name } => name,
}
}
}
fn main() {
let city = CityType::City { name: "NY".to_owned() };
println!("Name of the city: {}", city.name());
}
說明:
起初,你R法的簽名指定您消耗對象:
fn name(self) -> &str {
調用此方法後,您將不再能夠使用的實例。如果你想讀一個字符串,你應該接受一個參考:
fn name(&self) -> &str {
這就引出了另一個問題
match
應在不移動對象的工作,所以這裏是*
:
match *self {
你不應該從枚舉的數據中移出,所以ref
關鍵字幫助
CityType::City { ref name } => name,
該關鍵字表示我們必須使用模式匹配和對值的引用。
在main
中,您通過了&str
,但枚舉中的項是String
,所以這會導致不兼容的類型錯誤。通過調用.to_owned()
方法在一根繩子上的參考,你從它創建一個新的String
對象:
let city = CityType::City { name: "NY".to_owned() };
的評論:
的問題是更普遍:如何REF返回一個字符串它沒有生命週期說明符,因爲它只要枚舉一樣長。
在鏽你不能有一個參考沒有一生。決不。在某些情況下,編譯器可以爲您推導出生命週期,但也有一些情況是它不正確或不是您所期望的。在這種情況下,例如:
fn name(&self) -> &str {
有是壽命,編譯器將這種情況視爲如下:
fn name<'a>(&'a self) -> &'a str {
你引用綁定到相同的壽命,它們都可以使用。
你想要'name'方法做什麼?它有多個問題,答案可能取決於你的意圖。 –
@VictorPolevoy在這種情況下只是將ref返回給String。這個問題更一般:如何將ref返回給一個沒有生命週期說明符的String,因爲它只要enum一直存在。 – phodina
您需要(重新閱讀)[什麼是所有權](https://doc.rust-lang.org/book/second-edition/ch04-01-what-is-ownership.html#ownership-and-functions) Rust書中的章節。 'name(self)'接受枚舉的所有權,枚舉在函數返回時解除分配。您無法返回對釋放枚舉的引用。 – red75prime