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

时间:2019-01-02 07:21:17

标签: rust

我想创建一个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,
    }
}

1 个答案:

答案 0 :(得分:10)

您可以通过三种方式来实现这一点,但要权衡取舍。

返回拥有的字符串

您返回String并使用self.title.clone()

  • 优点:简单。
  • 缺点:即使在最简单的情况下,每次调用也会分配一个新的字符串。

当您没有理由认为这可能会成为性能问题,并且希望简单返回String时使用。

将ID存储在结构中

在构造函数中构建它。 (也可以按需构建它,但是会导致复杂的生命周期问题。)返回一个&str。几乎没有充分的理由使用&String

  • 优点:非常便宜的电话。
  • 缺点:需要存储ID。当titlepage_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),
    }
}
  • 优点:在简单情况下非常有效。不增加结构大小。不需要复杂的代码即可维护ID。
  • 缺点:使用方法稍微复杂一些,具体取决于用户对结果的处理方式。在复杂的情况下仍会分配新的字符串。

这是一个很好的默认使用方式,除非您真的希望保持API尽可能简单。