具有无限数量参数的Ruby函数

时间:2009-05-17 03:47:34

标签: ruby variadic-functions

如何创建没有明确参数数量的Ruby函数?

需要进一步澄清吗?

5 个答案:

答案 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下测试)