Ruby参数计数规则

Ruby参数计数规则,第1张

概述Ruby中关于各种类似函数的结构的参数数量以及如何调用它们的规则是什么? 例如我注意到当具有多个参数的块时,传递一个数组参数,它会被扩展,这似乎不适用于方法.我经常在Hash对象上看到Enumerable模块方法. {a: 5}.map{|x| x} # [[:a, 5]]{a: 5}.map{|k, v| [k, v]} # [[:a, 5]][[:a, 5]].map{|x| x} # [ 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 # 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参数计数规则所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1285230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存