什么时候使用带函数参数的 ref 有用
When is it useful to use `ref` with a function paramter
这个问题不是关于fn foo(x: &T)
和fn foo(ref x: T)
的区别。
我想问一下什么时候使用后者是可取的/惯用的。我无法想象你需要在函数签名中使用 ref
关键字的场景,因为你可以在函数中声明 fn foo(x: T)
并使用 &x
。
在函数参数列表的顶层,ref
没有合理的用例。它基本上导致将值的所有权移入函数,但您只能获得一个参考。
在函数参数列表中允许这样做的原因是与语言其他部分的模式匹配语法一致。您可以使用任何不可反驳的模式作为函数参数,就像在 let
语句中一样。这些赋值的语法和语义本质上是相同的,但并非技术上 允许 出现在函数参数列表中的所有内容实际上都有意义,正如并非所有编译的代码实际上都是有用的一样。剪辑 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
的类型更加不透明。
这个问题不是关于fn foo(x: &T)
和fn foo(ref x: T)
的区别。
我想问一下什么时候使用后者是可取的/惯用的。我无法想象你需要在函数签名中使用 ref
关键字的场景,因为你可以在函数中声明 fn foo(x: T)
并使用 &x
。
在函数参数列表的顶层,ref
没有合理的用例。它基本上导致将值的所有权移入函数,但您只能获得一个参考。
在函数参数列表中允许这样做的原因是与语言其他部分的模式匹配语法一致。您可以使用任何不可反驳的模式作为函数参数,就像在 let
语句中一样。这些赋值的语法和语义本质上是相同的,但并非技术上 允许 出现在函数参数列表中的所有内容实际上都有意义,正如并非所有编译的代码实际上都是有用的一样。剪辑 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
的类型更加不透明。