2016-04-24 49 views
-1

我意外地增加了阵列及其参数的推送方法之间的空间,所以我就这样:添加“推”和括号之间的空间会导致错误在红宝石

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

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

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

+0

我可以说Ruby的解释器在使用'()'方面是灵活的,因此,有时会解释空白。例如,为你编写'@credits.push描述:描述,数量:数量'和ruby会为你添加'()'。我在猜测,相同的解析逻辑(在那种情况下会添加括号)正被使用括号和空格所困惑。传统上,该方法将写为'@ credits.push()'。我还会指出你正在使用散列,并省略了红宝石加入的{}' - > – John

回答

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'语法不是有效的Range定义语法。

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

+0

我同意你的意见。但是,在第二组语句中,只有'[1,2] .include? (a:1)'说明了这个问题;其他人的行为是相同的,没有空间。 (例如,使用范围的最后一个语句将在有或没有空格的情况下返回false。)。顺便说一句,这里是一个例子,行为如何不同和有没有空间:https://gist.github.com/keithrbennett/be8f16f06612603fc352fa0c37d86d53。 –

+0

准确。正如你所看到的,每条语句的右边有一个返回值,显示哪条语句正确,哪条不正确。我正在展示一种解释器无法正确猜测的情况。其他时候,它可以正确猜测。 – Uzbekjon