这个问题与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))
我个人更喜欢更长,更明确的版本,因为“符合人体工程学”的版本使x
和y
的类型更加不透明。
关于rust - 何时将 `ref`与函数参数一起使用会很有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65953526/