对于返回带有父级生命周期的&str或new字符串的方法,返回类型应该是什么?

Ben*_*Ben 1 rust

我想创建一个id方法,它返回一个id,一个struct属性,或一个新的字符串.

我的归还类型应该是什么?&str用于返回struct属性self.title,但是具有调用范围生命周期的新字符串的返回类型是什么?

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

Seb*_*edl 10

您可以通过三种方式实现此目标,并进行不同的权衡.

返回拥有的字符串

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

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

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

将id存储在struct中

在构造函数中构建它.(按需构建它也是可能的,但会导致复杂的生命周期问题.)返回a &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),
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 优点:在简单的情况下高效.不增加结构大小.不需要复杂的代码来维护id.
  • 缺点:用法稍微复杂一些,具体取决于用户对结果的处理方式.仍然在复杂的情况下分配一个新的字符串.

这是一个很好的默认使用,除非你真的想让API保持尽可能简单.

  • "Cow"的完美用例是当效率增益值得使用损失时.由于我不知道用例是什么,我不能说最好的方法是什么.但我可以以更中立的方式制定这个职位. (3认同)
  • *"你可以归还一头牛,但这会使方法的使用变得复杂"*:这不是一个'Cow`的完美用例吗?你的评论使它看起来不是最好的解决方案,我担心它可能会被严重解释. (2认同)