为什么f(arg,superfluous_arg)是一个ArgumentError而f(arg,superfluous_arg)是一个SyntaxError?

时间:2013-05-06 10:45:18

标签: ruby syntax arguments whitespace

在Ruby 1.9.3中,我有一个带有单个参数的函数。如果我正确地调用它,它可以使用或不使用空格分隔其名称和括号。如果我通过额外的论证,它会以两种不同的方式失败。为什么呢?

irb(main):001:0> def f(a); a; end
=> nil
irb(main):002:0> f(1)
=> 1
irb(main):003:0> f(1, 2)
ArgumentError: wrong number of arguments (2 for 1)
        from (irb):1:in 'f'
        from (irb):3
        from /usr/bin/irb:12:in '<main>'
irb(main):004:0> f (1)
=> 1
irb(main):005:0> f (1, 2)
SyntaxError: (irb):5: syntax error, unexpected ',', expecting ')'
f (1, 2)
     ^
        from /usr/bin/irb:12:in '<main>'
irb(main):006:0> RUBY_DESCRIPTION
=> "ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]"

1 个答案:

答案 0 :(得分:9)

第一个错误:

>> f(1, 2)
ArgumentError: wrong number of arguments (2 for 1)

...非常简单,你只传递了一个参数太多了。

让我们专注于第二个错误!

>> f (1, 2)

这相当于:

>> f((1, 2))

这也是无效的语法。这是因为:

(1, 2)

...也不是有效的表达式。你可以更简单地看到这个:

>> 1, 2
SyntaxError: (irb):9: syntax error, unexpected ',', expecting $end

为什么f (1)有效?

(1)只评估为1

>> (1)
=> 1

这一切意味着什么?

Method calls看起来像这个“method_name(parameter1, parameter2, …)”(在左括号前没有空格)或者像“method_name parameter1, parameter2, …”(根本没有括号)。

正如您所见,混合空格和圆括号可能会导致某些地方出现意外行为。