为什么full_name()
函数中self
前有一个&
符号,而to_tuple中没有()
函数?当我看它们时,self
的用法在两个功能上都差不多,但为什么要使用&
。此外,当我将 &
添加到 to_tuple()
或从 full_name()
中删除它时,它会引发错误。谁能解释一下?
fn full_name(&self) -> String {
format!("{} {}", self.first_name, self.last_name)
}
fn to_tuple(self) -> (String, String) {
(self.first_name, self.last_name)
}
最佳答案
full_name
不消耗 self
,它通过 &self
使用引用:成员仅通过引用用作 的参数format!()
,所以一个引用就足够了。
to_tuple
(正如名称 to_...
所暗示的那样)使用 self
:它从 self
移动成员> 进入返回的元组。由于原始的 self
在移动后不再是有效内存(self
不再拥有内存),它必须被消耗,因此通过 self< 移动
.
您可以将full_name
更改为使用self
,即转移所有权。但是,这会变得不方便,因为调用该函数会在不需要的情况下使用该结构。
to_tuple
可以更改为不使用 self
,但它需要 .clone()
(复制)成员,这是昂贵的。
关于实现结构时将指针作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033162/