gpt4 book ai didi

Ruby 参数计数规则

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:41 27 4
gpt4 key购买 nike

Ruby 中关于各种类函数构造的参数数量以及如何调用它们的规则是什么?

例如我注意到,当具有多个参数的 block 传递一个数组参数时,它会被扩展,这似乎不适用于方法。我经常在 Hash 对象的 Enumerable 模块方法中看到这一点。

{a: 5}.map{|x| x} # [[:a, 5]]
{a: 5}.map{|k, v| [k, v]} # [[:a, 5]]
[[:a, 5]].map{|x| x} # [[:a, 5]]
[[:a, 5]].map{|k, v| [k, v]} # [[:a, 5]]

proc1 = Proc.new{|x| x}
proc1.call 5 # 5
proc1.call 5, 6 # 5
proc1.call [5, 6] # [5, 6]

proc2 = Proc.new{|k, v| [k, v]}
proc2.call 5 # [5, nil]
proc2.call 5, 6 # [5, 6]
proc2.call [5, 6] # [5, 6], not [[5, 6], nil]

def f(k, v); [k, v] end
f 5 # ArgumentError
f 5, 6 # [5, 6]
f [5, 6] # ArgumentError

def g(*vargs); vargs end
g 5 # [5]
g 5, 6 # [5, 6]
g [5, 6] # [[5, 6]]

然而 Proc.call 的文档似乎没有提到这一点。

然后还有稍微不同的 lambda,Proc 使用 &:name 的方法,也许还有其他一些。而且我不完全确定 Proc.new{|x| x}.callmethod_that_takes_a_block{|x| 中的 yield 完全相同x}.

最佳答案

这背后的原因是多变量赋值和自动分割

让我们以您的 proc2 为例(还有一个有趣的用例):

proc2 = Proc.new{|k, v| [k, v]}
proc2.call 5 # [5, nil]
proc2.call 5, 6 # [5, 6]
proc2.call [5, 6] # [5, 6], not [[5, 6], nil]
proc2.call [5, 6, 7] # [5, 6]

使用 ruby​​ 你可以做一个多变量赋值:

k, v= 5 # => k=5, v=nil
k, v= 5, 6 # => k=5, v=6
k, v= 5, 6, 7 # => k=5, v=6, 7 is not assigned

您还可以使用 splat 运算符扩展数组:

k, v= *[5, 6] # => k=5, v=6

您还可以使用 splat 运算符将多个变量打包到一个数组中:

k, *v= *[5, 6, 7] # => k=5, v=[6, 7]

ruby 可以在合适的时候自动展开:

k, v= [5, 6] # => k=5, v=6
k, v= [5, 6, 7] # => k=5, v=6, 7 is not assigned

据我所知,auto-splat 仅适用于变量和 Proc 参数赋值

关于Ruby 参数计数规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com