Rust 对于返回&str或具有父对象生存期的新字符串的方法,返回类型应该是什么?

Rust 对于返回&str或具有父对象生存期的新字符串的方法,返回类型应该是什么?,rust,Rust,我想创建一个id方法,它要么返回id(结构属性),要么返回一个新字符串 我的退货类型应该是什么&str返回一个结构属性self.title,那么调用作用域生存期内的新字符串的返回类型是什么 fn id(&self) -> &str { match self.type { PageType::Type1 => format!("{}-{}", self.title, self.page_num), PageType::Type2

我想创建一个id方法,它要么返回id(结构属性),要么返回一个新字符串

我的退货类型应该是什么&str返回一个结构属性self.title,那么调用作用域生存期内的新字符串的返回类型是什么

fn id(&self) -> &str {
    match self.type {
        PageType::Type1 => format!("{}-{}", self.title, self.page_num),
        PageType::Type2 => &self.title,
    }
}

有三种方法可以实现这一点,并有不同的权衡

返回一个拥有的字符串 返回字符串并使用self.title.clone

优点:简单。 缺点:每次调用都分配一个新字符串,即使是在简单的情况下。 当您没有理由认为这可能会成为性能问题,并且希望简单地返回字符串时使用

将id存储在结构中 在构造函数中构建它。按需构建it也是可能的,但会带来复杂的生命周期问题。返回一个&str。几乎没有一个好的理由使用&String

优点:非常便宜的电话。 缺点:需要存储id。当标题或页码字段更改时,需要将其保持最新。 如果经常访问,请使用

归还 这种类型能够表示借来的或拥有的对象,并且通过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),
    }
}
优点:在简单的情况下是有效的。不会增加结构大小。不需要复杂的代码来维护id。 缺点:用法稍微复杂一些,这取决于用户对结果的处理方式。仍然在复杂情况下分配新字符串。
这是一个很好的默认使用方法,除非您真的想让API尽可能简单。

有三种方法可以实现这一点,但需要进行不同的权衡

返回一个拥有的字符串 返回字符串并使用self.title.clone

优点:简单。 缺点:每次调用都分配一个新字符串,即使是在简单的情况下。 当您没有理由认为这可能会成为性能问题,并且希望简单地返回字符串时使用

将id存储在结构中 在构造函数中构建它。按需构建it也是可能的,但会带来复杂的生命周期问题。返回一个&str。几乎没有一个好的理由使用&String

优点:非常便宜的电话。 缺点:需要存储id。当标题或页码字段更改时,需要将其保持最新。 如果经常访问,请使用

归还 这种类型能够表示借来的或拥有的对象,并且通过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),
    }
}
优点:在简单的情况下是有效的。不会增加结构大小。不需要复杂的代码来维护id。 缺点:用法稍微复杂一些,这取决于用户对结果的处理方式。仍然在复杂情况下分配新字符串。
这是一个很好的默认使用方法,除非您真的希望使API尽可能简单。

您可以返回一个Cow,但这会使方法的使用变得复杂:这不是Cow的完美用例吗?你的评论让它看起来似乎不是这里的最佳解决方案,我担心它可能会被错误地解释。对于Cow来说,最完美的用例是效率的提高值可用性的损失。因为我不知道用例是什么,所以我不能说最好的方法是什么。但是我可以用一种更中性的方式来表达这篇文章。我不明白你所说的可用性损失是什么意思,Cow一直被设计成一个用户友好的工具。在我看来,最重要的是cow功能有过热现象,人们通常会忘记这一点,我同意这点,但要始终记住,有些功能不是免费提供的。但这是一个自由的抽象概念,我已经改写了这篇文章,使之更加平衡。可用性的损失来自于包装器。是的,deref强制意味着许多用法是相同的,但在某些情况下,用户实际上必须理解拥有cow意味着什么。您可以返回cow,但这使方法的使用变得复杂:这不是cow的完美用例吗?你的评论让它看起来似乎不是这里的最佳解决方案,我担心它可能会被错误地解释。对于Cow来说,最完美的用例是效率的提高值可用性的损失。因为我不知道用例是什么,所以我不能说最好的方法是什么。但是我可以用一种更中性的方式来表达这篇文章。我不明白你所说的可用性损失是什么意思,Cow一直被设计成一个用户友好的工具。在我看来,最重要的是cow功能有过热现象,人们通常会忘记这一点,我同意这点,但要始终记住,有些功能不是免费提供的。但这是一个自由的抽象概念,我已经改写了这篇文章,使之更加平衡。可用性的损失来自于包装器。是的,撤销强制意味着许多用法是相同的,但在某些情况下,用户实际上必须理解拥有一头奶牛意味着什么。