例如我注意到当具有多个参数的块时,传递一个数组参数,它会被扩展,这似乎不适用于方法.我经常在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 # 5proc1.call 5,6 # 5proc1.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] endf 5 # ArgumentErrorf 5,6]f [5,6] # ArgumentErrordef g(*vargs); vargs endg 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=nilk,v= 5,6 # => k=5,v=6k,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参数赋值
总结以上是内存溢出为你收集整理的Ruby参数计数规则全部内容,希望文章能够帮你解决Ruby参数计数规则所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)