在“之间添加空格”;推;括号会导致Ruby中出现错误

在“之间添加空格”;推;括号会导致Ruby中出现错误,ruby,Ruby,我不小心在数组的push方法和它的参数之间添加了一个空格,所以我得到了以下结果: def add_credit(description, amount) @credits.push ( description: description, amount: amount ) end 它导致了一个错误:语法错误,意外的tLABEL@credits.push(description:description,amount:amount)^ 在我移除“推”后的空格后,它就消失了。空格如何影响Rub

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

def add_credit(description, amount)
    @credits.push ( description: description, amount: amount )
end
它导致了一个错误:
语法错误,意外的tLABEL@credits.push(description:description,amount:amount)^


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

问题的原因是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解释器现在会认为您正在尝试传递一个
范围
作为参数。而且,
key:'value'
语法不是有效的范围定义语法


所以,Ruby解释器要求您清楚地使用大括号,并帮助它清楚地识别是方法的大括号还是参数的大括号。因为,使用空格,您将传递一个
范围
。请看最后一行。

我可以说Ruby的解释器在
()
的使用上非常灵活,因此,有时会解释空白。e、 例如,您可以编写
@credits.push description:description,amount:amount
,ruby会为您添加
()
。我猜相同的解析逻辑(在这种情况下会添加括号)会被括号和空格的使用弄糊涂。传统上,该方法将编写为
@credits.push()
。我还将指出,您正在使用散列并省略ruby添加的
{}
-->我同意您的看法。但是,在第二组语句中,只有
[1,2]。是否包含?(a:1)
说明了这个问题;其他人在有空间和没有空间的情况下表现相同。(例如,使用范围的最后一条语句将返回false(带空格或不带空格)。顺便说一句,下面是一个例子,说明了有空格和没有空格时行为的不同。如您所见,每条语句的右侧都有一个返回值,显示哪条语句是OK的,哪条语句不是OK的。我展示了一个例子,当口译员不能正确地“猜测”时。其他时候,它可以正确地猜测。