我如何 return 来自方法实现中枚举中字符串的 &str ?
How can I return a &str from Strings in an enum in a method impl?
我想return的名字city/town/village作为对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,
}
}
}
如果只是想return一个城市名而不消费掉对象,应该这样写:
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());
}
解释:
首先,您的方法的签名指定您消费对象:
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() };
您的评论:
The issue is more general: how to return ref to a String which has no lifetime specifier as it lives as long as the enum does.
在 Rust 中,你不能没有生命周期的引用。绝不。在某些情况下,编译器可以为您推断出生命周期,但在某些情况下,它会错误地或不符合您的预期。在这种情况下,例如:
fn name(&self) -> &str {
有个生命周期,编译器将其处理如下:
fn name<'a>(&'a self) -> &'a str {
您的引用绑定到相同的生命周期并且可以使用它们。
我想return的名字city/town/village作为对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,
}
}
}
如果只是想return一个城市名而不消费掉对象,应该这样写:
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());
}
解释:
首先,您的方法的签名指定您消费对象:
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() };
您的评论:
The issue is more general: how to return ref to a String which has no lifetime specifier as it lives as long as the enum does.
在 Rust 中,你不能没有生命周期的引用。绝不。在某些情况下,编译器可以为您推断出生命周期,但在某些情况下,它会错误地或不符合您的预期。在这种情况下,例如:
fn name(&self) -> &str {
有个生命周期,编译器将其处理如下:
fn name<'a>(&'a self) -> &'a str {
您的引用绑定到相同的生命周期并且可以使用它们。