我想创建一个id
方法,该方法返回一个ID(是struct属性)或一个新字符串。
我的退货类型应该是什么? &str
用于返回结构属性self.title
,但是具有调用范围生存期的新字符串的返回类型是什么?
fn id(&self) -> &str {
match self.type {
PageType::Type1 => format!("{}-{}", self.title, self.page_num),
PageType::Type2 => &self.title,
}
}
答案 0 :(得分:10)
您可以通过三种方式来实现这一点,但要权衡取舍。
您返回String
并使用self.title.clone()
。
当您没有理由认为这可能会成为性能问题,并且希望简单返回String
时使用。
在构造函数中构建它。 (也可以按需构建它,但是会导致复杂的生命周期问题。)返回一个&str
。几乎没有充分的理由使用&String
。
title
或page_num
字段更改时,需要保持最新状态。如果经常访问 ,则使用。
Cow
这种类型能够代表借来的东西或拥有的东西,并且通过deref强制行为就像在使用中借来的东西一样。
fn id(&self) -> Cow<str> {
match self.ty {
PageType::Type1 => Cow::Owned(format!("{}-{}", self.title, self.page_num)),
PageType::Type2 => Cow::Borrowed(&self.title),
}
}
这是一个很好的默认使用方式,除非您真的希望保持API尽可能简单。