为什么我需要额外的括号用于条件修饰符?

时间:2013-06-11 03:43:44

标签: ruby

当我在方法的参数位置使用条件修饰符时,我需要一对额外的括号(如果没有省略参数的括号):

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

为什么我需要这对额外的括号?它是否消除了歧义?

3 个答案:

答案 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或符号