在 Rust 中返回结构变量的引用有什么缺点吗?

问题描述 投票:0回答:1

给定这个结构:

struct TestS {
    astr: String,
}

impl TestS {
    pub fn new(s: String) -> Self { Self{ astr: s } }
    pub fn get_ref(&self) -> &String { &self.astr }
    pub fn get_val(&self) -> String { self.astr.clone() }
}

返回引用与返回值相比有什么缺点吗?我喜欢返回引用,因为它可以避免制作可能不必要的副本。 Rust 编译器应该防止悬空引用。如果需要,呼叫者可以复印一份。这是正确的吗?

rust reference lifetime
1个回答
0
投票

根据经验:

  • 如果您返回的是
    Copy
    ,则按值返回。
  • 如果函数具有该值的本地所有权(例如,一个已消耗
    self
    或可能已创建该值本身的方法),则按值返回它
  • 否则,返回一个引用并允许调用者在需要自有值时克隆它

如果需要克隆,则应该在需要拥有值的地方完成(即示例中的调用者)。

根据 @vallentin 的评论,对于字符串,您通常会返回

&str
而不是
&String
。返回
&String
需要双重取消引用来访问实际字符串内容,而返回
&str
返回一个胖指针 - 指向字符串内容和长度的指针 - 因此不需要双重取消引用。

© www.soinside.com 2019 - 2024. All rights reserved.