0

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

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

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

4

3 回答 3

2

这是 Ruby 中运算符优先级的问题。考虑一个例子:

> [1 if true]
# SyntaxError: unexpected modifier_if, expecting ']'
# [1 if true]
     ^
> [(1 if true)]
# => [
#   [0] 1
# ]

这里 Ruby 想要先计算方括号。只有当结果产生时,她才会应用条件 if。在内部表达式中添加圆括号解决了一个问题,我们可能希望函数调用中的圆括号也足够了。

但是等等……Ruby 在函数调用中使用括号来表示参数列表。就像空格一样。在任何努力甚至查看后缀条件之前,都会评估参数列表。因此参数列表变为:baz if true,而参数名称中不允许有空格(现阶段不知道条件。)

添加第二对括号会将参数列表变成一个参数,包含在圆括号内。

于 2013-06-11T04:41:44.903 回答
0

在某些地方,您不能以显式形式使用带有 if_modifier 的表达式 - 您必须使用括号对其进行评估。

就像你的函数调用示例一样,你不能在哈希初始化中使用显式 if_modifier ,所以代码:

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

导致语法错误,因此您还必须将其括在括号中:

  a = {'aa' => (1 if true)}
于 2013-06-11T04:21:27.770 回答
-1

这是因为您期望的是参数而不是条件,这就是为什么当您编写附加括号时您没有错误,因为它返回 nil 或符号

于 2013-06-11T04:24:36.180 回答