Ruby参数计数规则

Fir*_*cer 4 ruby syntax lambda function

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

例如,我注意到当具有多个参数的块时,传递一个数组参数,它会被扩展,这似乎不适用于方法.我经常在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]]
Run Code Online (Sandbox Code Playgroud)

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

然后还有一些略有不同的lambda,即Proc使用的方法&:name,也许还有其他一些方法.我并不完全确定Proc.new{|x| x}.callyielda中的完全相同method_that_takes_a_block{|x| x}.

Tho*_*tre 7

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

让我们以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]
Run Code Online (Sandbox Code Playgroud)

用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
Run Code Online (Sandbox Code Playgroud)

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

k, v= *[5, 6] # => k=5, v=6
Run Code Online (Sandbox Code Playgroud)

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

k, *v= *[5, 6, 7] # => k=5, v=[6, 7]
Run Code Online (Sandbox Code Playgroud)

适当的时候,红宝石可以自动啪!

k, v= [5, 6] # => k=5, v=6
k, v= [5, 6, 7] # => k=5, v=6, 7 is not assigned
Run Code Online (Sandbox Code Playgroud)

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