为什么这段代码在Ruby 1.8中能够正常工作,而在Ruby 1.9中却不能?

6
这段代码:
def func *; end
[func "hello"]

在 Ruby 1.8.7 中解析时没有错误,但返回语法错误:
syntax error, unexpected ']', expecting '}'

在Ruby版本大于等于1.9中,我查看了Ruby 1.8和Ruby 1.9之间的区别,但没有找到相关的参考。有人知道是什么改变导致了这个问题吗?

1
只是为了看看 - 你可以试试 r = [func("你好")] 吗? - Arup Rakshit
@Babai 不是的。这是一个语法错误:syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('。看起来是一个优先级问题,因为使用括号调用该方法可以正常工作。 - fotanus
1个回答

5

这是为了避免歧义。考虑以下情况:

def foo(a, b = 1) # foo takes an optional second argument
end

[foo 1, 2]

这可以被解释为[(foo 1), 2]或者[(foo 1, 2)]

调用方法文档中有两个参考(虽然与数组字面量没有直接关系):

请注意,括号是可选的...除非使用和省略括号之间有区别

在许多情况下,发送消息时不需要括号...但是,为了避免歧义,需要使用括号。


def foo(a) end; [foo 1] 在v2.0.0中生成相同的错误,但这里没有歧义。 - Cary Swoveland
@CarySwoveland 错误是在解析器级别引发的,与方法定义无关。毕竟,Ruby是一种动态语言,允许您随时更改方法。 - Stefan
在我的例子中,def foo(a) end,我注意到 [foo 1][foo (1)] 都会产生错误,但是 [foo(1)] 是可以的。我知道最好的做法是避免在方法名和开括号之间加空格,但在某些情况下是允许的,尽管似乎有点模糊不清。无论如何,我认为在这方面 [foo 1] 被视为 [foo (1)],所以也许这就是解析器正在查看的内容。 - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接