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

相关问题