如何在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());
}
说明:
起初,你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 {
你引用绑定到相同的寿命,它们都可以使用。
以上是 如何在impl方法的枚举中从字符串返回&str? 的全部内容, 来源链接: utcz.com/qa/263220.html