在“push”和括号之间添加空格会导致Ruby出错

时间:2016-04-24 10:17:34

标签: ruby

我不小心在数组的push方法和参数之间添加了一个空格,所以我得到了这个:

def add_credit(description, amount)
    @credits.push ( description: description, amount: amount )
end

并导致错误:syntax error, unexpected tLABEL @credits.push ( description: description, amount: amount ) ^

在“推”之后删除了空格后,它就消失了。空间如何影响Ruby中的语法?

1 个答案:

答案 0 :(得分:1)

问题的原因是Ruby解释器无法弄清楚这是一种方法的括号还是参数。

例如,如果您使用"简单"传递参数。你的方法的语法,它会工作得很好:

[1, 2].include? 1        # => true
[1, 2].include? (1)      # => true
[1, 2].include? ( [ ] )  # => true

Ruby解释器可以猜测那些括号属于方法。

但是,如果你试图传递一个没有"简单"语法,例如散列(a: 1)或范围((1..2)),会导致错误:

[1, 2].include?(a: 1)    # => false
[1, 2].include? ({a: 1}) # => false
[1, 2].include? (a: 1)   # => SyntaxError: (irb):21: syntax error, unexpected tLABEL
[1, 2].include? (1..2)   # => false

由于Ruby解释器现在认为您正在尝试传递Range作为参数。并且,key: 'value'语法不是有效的范围定义语法。

因此,Ruby解释器要求你清楚地使用大括号,并帮助它清楚地识别,如果它是方法的大括号或参数。因为,通过空格,您传递的是Range。见最后一行。