13

为 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]

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

相关: 为什么非显式 splat 参数加上默认参数是 Ruby 1.9 中方法定义的错误语法?

4

4 回答 4

6

您尝试的用法违反了 splat 用法的约定。Splats 应该(至少在 Ruby 中)占用所有额外的(0、1 或更多)值。

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

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

编辑: 为了回答你为什么它不能完全清楚地工作的问题。这是语言设计者的设计决定。Matz 从未打算让 splat 运算符使用默认值。这对我来说似乎很明智,因为它旨在用于捕获不确定数量的变量,并且因为我描述的方法比您描述的可能性更清楚,并且因为您的示例解决的所有问题都可以通过其他方式解决。

于 2013-04-03T20:26:20.730 回答
4

您可以在方法本身中设置默认值,因为默认 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?一个空数组是否被视为空白。希望有帮助。

于 2013-04-03T20:28:45.540 回答
0

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

def a(b, *c)
  c
end

a("foo")
#=> []
于 2013-04-03T20:23:48.437 回答
0

这非常方便:

def initialize(*response_names)
  @response_names = response_names.presence || %w(default values)
end
于 2017-02-09T17:13:40.860 回答