实现结构时将指针作为函数参数

标签 pointers rust

为什么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/

相关文章:

c++ - 如何从传递给 C++ 函数的对象访问动态二维数组?

C 指针输出不清楚

rust - 如何使用 Rust 创建死锁?

java - Java中如何模拟指针类型的 Action ,还是Java是引用传递还是值传递?

Java:你能像 C 中那样对待 null 像整数 0 吗?

rust - rustc-std-workspace-core crate 的用途是什么?

unit-testing - 如何在单元测试中以编程方式设置target_os?

haskell - 如何将 Haskell 库与 Rust 项目静态链接?

rust - 如何使用可能失败的函数调用 Iterator .map()?

c - 如何制作结构数组