如何在Ruby中为splat参数设置默认值

时间:2013-04-03 20:16:23

标签: ruby splat

为splat参数设置默认值会产生错误:

1.9.3-p374 :001 > def a b, *c = nil
1.9.3-p374 :002?>   end
SyntaxError: (irb):1: syntax error, unexpected '=', expecting ';' or '\n'
def a b, *c = nil
             ^
    from /Users/me/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in `<main>'

我尝试的一些变体也无效:

1.9.3-p374 :003 > def a b, *c = []
1.9.3-p374 :005 > def a b, (*c) = nil
1.9.3-p374 :007 > def a b, (*c = [])
1.9.3-p374 :009 > def a b, (*c = [1,2,3])
1.9.3-p374 :011 > def a b, *c = [1,2,3]

我在这里看不到不确定性问题,所以看起来应该是可能的。

相关:Why non-explicit splat param plus default param is wrong syntax for method definition in Ruby 1.9?

4 个答案:

答案 0 :(得分:6)

您的尝试使用是违反splat使用的惯例。假设Splats(至少在Ruby中)占用所有额外的(0,1或更多)值。

如果您知道您希望方法参数列表中的第二个值具有默认值,则可以将其从splat中取出并在splat之前使用默认值列出它:

def a b, c=nil, *d 
  # rest of code omitted
end

修改 为了解答为什么它不能完全清楚地解决你的问题。这是语言设计师的设计决定。 Matz从未打算让splat运算符使用默认值。这对我来说似乎很合理,因为它旨在用于捕获不确定数量的变量,因为我描述的方法比你描述的可能性读得更清楚,因为你的例子解决的所有问题都可以通过其他方式解决。 / p>

答案 1 :(得分:2)

您可以在方法中设置默认值,因为默认的splat会返回一个空数组。

def test(a, *b)
  b = "default b" if b == [] # edited as per Tin Man's recommendation
  puts [a, b].inspect
end

test("Test", 1, 2)
# => ["Test", [1, 2]]
test("Test")
# => ["Test", "default b"]

在Rails中,您可以检查b.present?,因为空数组被视为空白。希望有所帮助。

答案 2 :(得分:0)

splat参数默认为空数组,无需执行任何特殊操作。

def a(b, *c)
  c
end

a("foo")
#=> []

答案 3 :(得分:0)

这很方便:

def initialize(*response_names)
  @response_names = response_names.presence || %w(default values)
end