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

Ruby 为什么条件修饰符需要额外的括号?,ruby,Ruby,当我在方法的参数位置使用条件修饰符时,我需要一对额外的括号(如果参数的括号没有省略): 为什么我需要这对额外的括号?它能消除歧义吗?在某些地方,你不能使用带有if_修饰语的表达式来显式表示——你必须用括号来计算它 就像您的函数调用示例一样,您不能在哈希初始化中使用显式if_修饰符,因此代码: a = {'aa' => 1 if true} 导致语法错误,因此您还必须将其包含在parenthases中: a = {'aa' => (1 if true)} 这是因为您需要的是

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


为什么我需要这对额外的括号?它能消除歧义吗?

在某些地方,你不能使用带有if_修饰语的表达式来显式表示——你必须用括号来计算它

就像您的函数调用示例一样,您不能在哈希初始化中使用显式if_修饰符,因此代码:

  a = {'aa' => 1 if true}
导致语法错误,因此您还必须将其包含在parenthases中:

  a = {'aa' => (1 if true)}

这是因为您需要的是一个参数而不是条件,这就是为什么在编写附加括号时没有错误,因为它返回nil或symbol,这在Ruby中是运算符优先级的问题。考虑一个例子:

> [1 if true]
# SyntaxError: unexpected modifier_if, expecting ']'
# [1 if true]
     ^
> [(1 if true)]
# => [
#   [0] 1
# ]
这里Ruby首先要计算方括号。只有当结果产生时,她才会应用条件if。在内部表达式中添加圆括号解决了一个问题,我们可能希望函数调用中的圆括号也足够了

但是等等……Ruby在函数调用中使用括号来表示参数列表。就像空间一样。而且参数列表在试图查看后缀条件之前就已经被评估过了。因此,参数列表变成了
:baz if true
,而参数名称中不允许使用空格(在这个阶段不知道条件)


添加第二对括号将参数列表转换为一个参数,包含在圆括号内。

在方法调用中,您需要的不是参数,而是表达式(
1,如果为true,则也是表达式),因此没有太明显的问题,这与运算符优先级无关,因为在示例中:
[1+2] <代码> +/<代码>操作具有较低优先级(如IFX修饰符),但此表达式没有错误地进行评估,从来没有理解为什么它同意考虑比代码更高优先级的代码> > [C]>,但后缀如果肯定是最低优先级的。所以,我认为,这个问题在空间分隔参数列表中(如您所选)
> [1 if true]
# SyntaxError: unexpected modifier_if, expecting ']'
# [1 if true]
     ^
> [(1 if true)]
# => [
#   [0] 1
# ]