为什么 `a (b.c do;end)` 不是一个符合语法的 Ruby 程序?

3
为什么这段代码在ruby18和ruby19中会出现语法错误:
a (b.c do;end)

我本以为它的意思是:调用方法a并传入一个参数。空格后面的括号不是方法参数括号,而只是普通的括号,就像你几乎可以在任何地方放置一样。参数是对象b上调用方法c并带有一个块的返回值。
然而,在ruby18中,以下所有内容都被解释为语法正确。只有第一个示例被Ruby19视为语法不正确。
a (b do;end)

并且:

a (b.c {})

并且:

(b.c do;end)
1个回答

0

移除方法名和(之间的空格。Ruby曾经警告过这样做是不可靠的,在某些情况下似乎会使Ruby 1.9出现问题。


1
我知道,这个空格后面的括号不是正常的方法括号。我的直觉告诉我,它仍然应该是语法上有效的。为什么不是呢? - johannes
3
看起来是因为Matz的头脑:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/84104?help-en - Frederick Cheung
@Frederick Cheung:空格产生警告的原因是因为在那个位置语法不明确。它既可以是方法调用的括号,也可以是第一个参数的括号,两者都是可能的,Matz找不到解决这个冲突的方法。这仍然无法解释为什么a (b.c do;end)语法错误 - DarkDust
@DarkDust 因为语法是由规则定义的,而规则(在Matz给出的yacc中)说这是一个语法错误。有些事情,就像我的物理教授曾经说过的那样,它们就是这样的 :) - ian
@lain,这个问题不是关于自然法则,而是关于人工设计的软件的一种属性。 - johannes

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