如何创建没有明确参数数量的Ruby函数?
需要进一步澄清吗?
答案 0 :(得分:24)
使用splat运算符*
def foo(a,b,c,*others)
# this function has at least three arguments,
# but might have more
puts a
puts b
puts c
puts others.join(',')
end
foo(1,2,3,4,5,6,7,8,9)
# prints:
# 1
# 2
# 3
# 4,5,6,7,8,9
答案 1 :(得分:17)
使用*rest
。这是一个不错的小tutorial。
答案 2 :(得分:6)
(如果我可以在接受的答案中添加评论,我会,但我没有足够的分数。)
警告:对于处理常规数据的方法,请注意这样做。它是一个很好的语法糖,但是限制你可以在获得SystemStackError之前传递给方法的参数数量。我使用redis.mapped_mget *keys
达到了这个限制。此外,限制将根据您使用splat运算符的位置而更改。例如,在本地运行pry,我可以将超过130,000个元素的数组打包到方法中。但是,在赛璐珞演员中运行,该限制可能少于16,000个元素。
答案 3 :(得分:2)
这是关于这个主题的另一篇文章:
www.misuse.org/science/2008/01/30/passing-multiple-arguments-in-ruby-is-your-friend
使用“*”
提供一些很好的例子来滚动和展开你的参数答案 4 :(得分:0)
此外,这也是传递多个 named 参数的有趣的“外观相似”技术。这是基于以下事实:如果在需要一个位置参数的位置给出Ruby,Ruby会将一系列命名参数转换为哈希值:
def hashed_args_test(args = {})
p args
end
hashed_args_test(arg1: "val1", arg2: "val2")
# => {:arg1=>"val1", :arg2=>"val2"}
hashed_args_test( {arg1: "val1", arg2: "val2"} )
# => {:arg1=>"val1", :arg2=>"val2"}
因此,两种调用该方法的方式都提供(任意数量)元素的哈希-无论是显式使用哈希语法还是看上去完全像传递命名参数一样。 (已在Ruby 2.5.3下测试)