加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby参数计数规则

发布时间:2020-12-17 02:49:24 所属栏目:百科 来源:网络整理
导读:Ruby中关于各种类似函数的结构的参数数量以及如何调用它们的规则是什么? 例如我注意到当具有多个参数的块时,传递一个数组参数,它会被扩展,这似乎不适用于方法.我经常在Hash对象上看到Enumerable模块方法. {a: 5}.map{|x| x} # [[:a,5]]{a: 5}.map{|k,v| [k,
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]].map{|k,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]}
proc2.call 5 # [5,nil]
proc2.call 5,6 # [5,6]
proc2.call [5,6],not [[5,nil]

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

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

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

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

解决方法

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

让我们以proc2为例(附加一个有用的用例):

proc2 = Proc.new{|k,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,7 # => k=5,v=6,7 is not assigned

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

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

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

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

适当的时候,ruby可以自动啪!

k,v= [5,7 is not assigned

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读