ruby 方法和括号之间没有空格时出错

q9yhzks0  于 2024-01-07  发布在  Ruby
关注(0)|答案(1)|浏览(163)

是什么导致了下面的错误?我希望它们都返回2。
Ruby样式指南鼓励方法名和括号之间没有空格,因此当有空格时,Rubocop会使用(安全自动更正)Lint/ParenthesesesAsGroupedExpression警告。但是与样式指南保持一致,没有空格会导致实际错误。

Integer.sqrt (4 if true) # 2

Integer.sqrt(4 if true) # syntax error, unexpected `if' modifier, expecting ')'

字符串
有一个related question 10年前,探讨了类似的问题与最高评级的答案(2票),这是不接受的OP,我觉得不清楚,难以理解。对这个问题的回答似乎更清晰,更全面。这个问题还提到了一个细微差别与Rubocop进一步探讨。

bkhjykvo

bkhjykvo1#

详尽的解释相当复杂,需要深入研究Ruby BNF grammar,但简单的(r)解释需要理解两件事:
1.如果你不使用function(args)(不带空格和圆括号),那么你就是在让Ruby猜测你的意思。如果你总是使用function(args),那么Ruby知道它是一个带参数的函数调用。如果你不这样做,那么Ruby将不得不猜测你的意思。
举个例子。以function 4 if true为例。Ruby怎么知道你在这里的意思?要么是function((4 if true)),要么是function(4) if true。Ruby必须“猜测”。
这只是一个例子,你必须把这个规则和下面的规则2结合起来才能理解全貌:
1.你不能把控制语句(if,while,unless等)作为函数参数,除非你把它放在括号里。
如果你接受这两个规则,1和2一起,你会明白这一点:

function (control_statement)

字符串
将被解释为:

function((control_statement))


因此,如果你打算在参数列表中使用控制语句,唯一允许的形式是:

Integer.sqrt((4 if true))


所有其他形式都会使解释器感到困惑,并且是Ruby语法所不允许的。

相关问题