2012-01-04 75 views
3

爲什麼給出ruby18此代碼,並ruby19語法錯誤:爲什麼`a(b.c do; end)`不是一個語法正確的Ruby程序?

a (b.c do;end) 

我本來期望它意味着以下。用一個參數調用方法a。空格後面的括號不是方法參數括號,但只有像您這樣的正常括號幾乎可以放在任何地方。參數是對象b上方塊c的調用返回值。

但是,下列所有內容都被ruby18解釋爲語法正確。只有這些例子中的第一個被ruby19視爲語法錯誤。

a (b do;end) 

和:

a (b.c {}) 

和:

(b.c do;end) 

回答

0

在方法名和(之間取出的空間。紅寶石曾經警告說這是狡猾的,而且在某些情況下似乎會拋出Ruby 1.9。

+1

我知道,這些括號之後的空格不是正常的方法括號。我的直覺說,它仍然應該是句法上有效的。爲什麼不是? – johannes 2012-01-04 13:57:48

+3

顯然,這是因爲馬茨的大腦:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/84104?help-en – 2012-01-04 14:28:44

+0

@Frederick Cheung:空間之所以正在產生一個警告是因爲在那一點上語法是*模棱兩可的。它可能是方法調用或第一個參數的括號,兩者都是可能的,Matz無法找到解決衝突的解決方案。它仍然不能解釋爲什麼'a(b.c do; end)'是一個*語法錯誤*。 – DarkDust 2012-01-04 18:15:03