如何在impl方法的枚举中从字符串返回&str?

我想返回城市/城镇/村庄的名称作为参考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

回答:

如果你只是想返回城市名没有通过消耗失去了对象,你应该把它写成如下:

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 { 

你引用绑定到相同的寿命,它们都可以使用。

以上是 如何在impl方法的枚举中从字符串返回&str? 的全部内容, 来源链接: utcz.com/qa/263220.html

回到顶部