当我在方法的参数位置使用条件修饰符时,我需要一对额外的括号(如果没有省略参数的括号):
def foo bar; end
foo(:baz if true) # => Error
foo(:baz if false) # => Error
foo (:baz if true) # => Error
foo (:baz if false) # => Error
foo((:baz if true)) # => No Error
foo((:baz if false)) # => No Error
为什么我需要这对额外的括号?它是否消除了歧义?
答案 0 :(得分:2)
这是Ruby中运算符优先级的问题。考虑一个例子:
> [1 if true]
# SyntaxError: unexpected modifier_if, expecting ']'
# [1 if true]
^
> [(1 if true)]
# => [
# [0] 1
# ]
Ruby希望首先评估方括号。只有当结果产生时,她才会应用条件if。将圆括号添加到内部表达式可以解决一个问题,我们可能期望函数调用中的圆括号也足够了。
但等等...... Ruby在函数调用中使用括号来表示参数列表。正如空间一样。并且正在评估参数列表之前任何努力甚至看看后缀条件。因此参数列表变为:baz if true
,而参数名称中不允许使用空格(此阶段不了解条件。)
添加第二对括号将参数列表转换为一个参数,包含在圆括号内。
答案 1 :(得分:0)
在某些地方你不能以明确的形式使用带有if_modifier的表达式 - 你必须用括号来评估它。
就像你的函数调用示例一样,你不能在哈希初始化中使用显式的if_modifier,所以代码:
a = {'aa' => 1 if true}
导致语法错误,因此您还必须将其括起到父对象:
a = {'aa' => (1 if true)}
答案 2 :(得分:-1)
这是因为你期望参数不是一个条件,这就是为什么当你写下额外的括号时你没有错误,因为它返回nil或符号