Rust 我怎样才能退回a&;方法impl中枚举中字符串的str?
我想返回城市/城镇/村庄的名称,作为对Rust 我怎样才能退回a&;方法impl中枚举中字符串的str?,rust,borrow-checker,Rust,Borrow Checker,我想返回城市/城镇/村庄的名称,作为对str的引用。我可以在实现中指定生存期,但也为枚举指定它会导致错误,因为它没有声明引用 enum CityType { City { name: String /* ... */ }, Town { name: String /* ... */ }, Village { name: String /* ... */ }, } impl CityType { fn name(self) -> &str {
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,
}
}
}
如果您只想返回一个城市名称,而不想因消费而丢失对象,则应按以下方式编写:
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<'a>(&'a self) -> &'a str {
说明:
fn name(self) -> &str {
调用此类方法后,您将无法再使用该实例。如果要读取字符串,应接受引用:
fn name(&self) -> &str {
这导致了另一个问题match
应该在不移动对象的情况下工作,因此这里是*
:
match *self {
ref
关键字有帮助
CityType::City { ref name } => name,
这个关键字表示我们必须使用模式匹配来引用值main
中,您传递了一个&str
,但枚举中的项是字符串,因此这会导致不兼容类型错误。通过对字符串引用调用.to_owned()
方法,可以从中创建一个新的string
对象:
let city = CityType::City { name: "NY".to_owned() };
fn name(&self) -> &str {
有生命周期,编译器将其视为以下内容:
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<'a>(&'a self) -> &'a str {
fn name&'a str{
您的引用绑定到同一个生存期,并且可以使用它们。您希望
name
method做什么?它有多个问题,答案可能取决于您的意图。@VictorPolevoy在本例中只需将ref返回到字符串。问题更一般:如何将ref返回到没有生存期说明符的字符串因为它的寿命与枚举的寿命一样长。您需要(重新)阅读锈书中的章节。name(self)
拥有枚举的所有权,并且在函数返回时取消分配枚举。您无法返回对取消分配枚举的引用。感谢您的解释。这正是我的使用案例。