rust - 何时将 `ref`与函数参数一起使用会很有用

标签 rust binding

这个问题与fn foo(x: &T)fn foo(ref x: T)之间的区别无关。
我想问一下什么时候需要/习惯上正确使用后者。我无法想象一个场景,您需要在函数签名中使用ref关键字,因为您可以只声明fn foo(x: T)并在函数内部使用&x

最佳答案

在功能参数列表的顶层,没有ref的合理用例。从根本上说,这导致将值的所有权移到函数中,但是您只能得到一个使用它的引用。
函数参数列表中允许这样做的原因是与语言其他部分中的模式匹配语法一致。您可以使用任何不可辩驳的模式作为函数参数,就像let语句中一样。这些赋值的语法和语义本质上是相同的,但是并不是技术上允许在函数参数列表中的所有内容实际上都有意义,就像并不是所有编译的代码实际上都有用。 Clippy warns against using ref at the top level of a function parameter list
在函数参数列表中使用ref进行解构可能会很有用。例如,如果您接受对&(String, String)对的引用,并且想为两个条目赋予单独的名称,则可以使用

fn foo(&(ref x, ref y): &(String, String))
为了达成这个。在这里不使用ref将是无效的,因为您不能拥有这些字符串的所有权。
match ergonomics到来以来,可以使用更简洁的语法来重写ref关键字的这种(和大多数其他)用法。
fn foo((x, y): &(String, String))
我个人更喜欢更长,更明确的版本,因为“符合人体工程学”的版本使xy的类型更加不透明。

关于rust - 何时将 `ref`与函数参数一起使用会很有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65953526/

相关文章:

rust - serde如何将字符串中的值转换为类型

rust - 拆分字符串并保留分隔符

c# - C# 中的后期绑定(bind)到 XAML/Store 应用程序中的 Word 控件

jquery - 如何在ajax加载的元素上绑定(bind)事件

c# - 静态属性/ViewModel(C#、WinRT)

binding - Multi-Tenancy ServiceStack API,是否可以通过相同的部署来响应不同主机名上的请求?

WCF 可能超出了我的响应大小

rust - 如何运行可以接受未指定数量的 env 参数的命令?

parsing - 使用 nom 匹配行尾或文件尾

rust - 堆栈溢出堆缓冲区?