2017-12-18 125 views
2

我想返回城市/城鎮/村莊的名稱作爲參考str。我可以在實現中指定生命週期,但也可以爲枚舉指定錯誤,因爲它沒有聲明引用。如何在impl方法的枚舉中從字符串返回&str?

enum CityType { 
    City { name: String /* ... */ }, 
    Town { name: String /* ... */ }, 
    Village { name: String /* ... */ }, 
} 

impl CityType { 
    fn name(self) -> &str { 
     match self { 
      CityType::City { name } => &name, 
      CityType::Town { name, .. } => &name, 
      CityType::Village { name } => &name, 
     } 
    } 
} 

playground

+2

你想要'name'方法做什麼?它有多個問題,答案可能取決於你的意圖。 –

+0

@VictorPolevoy在這種情況下只是將ref返回給String。這個問題更一般:如何將ref返回給一個沒有生命週期說明符的String,因爲它只要enum一直存在。 – phodina

+4

您需要(重新閱讀)[什麼是所有權](https://doc.rust-lang.org/book/second-edition/ch04-01-what-is-ownership.html#ownership-and-functions) Rust書中的章節。 'name(self)'接受枚舉的所有權,枚舉在函數返回時解除分配。您無法返回對釋放枚舉的引用。 – red75prime

回答

5

如果你只是想返回城市名沒有通過消耗失去了對象,你應該把它寫成如下:

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()); 
} 

說明:

  1. 起初,你R法的簽名指定您消耗對象:

    fn name(self) -> &str { 
    

    調用此方法後,您將不再能夠使用的實例。如果你想讀一個字符串,你應該接受一個參考:

    fn name(&self) -> &str { 
    

    這就引出了另一個問題

  2. match應在不移動對象的工作,所以這裏是*

    match *self { 
    
  3. 你不應該從枚舉的數據中移出,所以ref關鍵字幫助

    CityType::City { ref name } => name, 
    

    該關鍵字表示我們必須使用模式匹配和對值的引用。

  4. 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 { 

你引用綁定到相同的壽命,它們都可以使用。

+1

感謝您的解釋。這正是我的用例。 – phodina

相關問題