'[1 + x [1]]'为什么'[f x [1]]'不合语法?

时间:2017-11-14 19:15:03

标签: ruby syntax

对于数组x,以下是语法表达式:

  • puts x[1]
  • [puts(x[1])]
  • [1 + x[1]]

但是这个:

  • [puts x[1]]

无法解析:

syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

为什么解析器无法找出这种语法?

2 个答案:

答案 0 :(得分:9)

我相信这种解析行为是故意的 - 而不是错误。这是Ruby的一个不幸的副作用,允许省略括号。当然,这段代码很好:

def f x, y=0
  x + y
end

f 2    # 2
f 2, 3 # 5

但这段代码的结果是什么?

[f 2, 3]

[2,3][5]?为了使语法分析器能够处理这个代码,需要理解该方法的优点。但是因为Ruby是动态的,在实际执行方法调用之前无法确定。

设计师在解析过程中选择了(仍然令人惊讶,但是)容易修复的错误,而不是允许模糊的情况,这肯定会在运行时产生令人惊讶的情况。

注意:你仍然可以争辩说,在它是最后一个元素的情况下,没有歧义

[3, f 2]
# should be [3, 2]

但是我可以想象,如果Ruby让我写下来然后在我向数组的末尾添加一个元素时给我一个语法错误。我可以理解决定不允许在数组中省略括号。

答案 1 :(得分:6)

在Ruby中,您经常可以但不总是省略方法调用的括号。您找到了一个您无法做到的案例。有时候,Ruby太过含糊不清,无法准确理解你想要的内容,而且你必须更加具体。

这里的有效表示法是:

[puts(x[1])]

虽然puts总是返回nil,但这真是一件奇怪的事情。

相关问题