是什么导致了下面的错误?我希望它们都返回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进一步探讨。
1条答案
按热度按时间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一起,你会明白这一点:
字符串
将被解释为:
型
因此,如果你打算在参数列表中使用控制语句,唯一允许的形式是:
型
所有其他形式都会使解释器感到困惑,并且是Ruby语法所不允许的。