为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?
答案 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