代码之家  ›  专栏  ›  技术社区  ›  Ben

返回&str或new string的方法的返回类型应该是什么?

  •  1
  • Ben  · 技术社区  · 6 年前

    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,
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  10
  •   Shepmaster Tim Diekmann    6 年前

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

    你回来了 String 和使用 self.title.clone()

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

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

    将id存储在结构中

    &str . 几乎没有一个好的理由可以使用 &String

    • 优点:非常便宜的电话。
    • 缺点:需要存储身份证。需要在 title page_num

    非常 经常。

    返回a 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尽可能简单。

    推荐文章