2011-05-30 34 views
9

有誰能夠解釋爲什麼下面的代碼有錯誤塊定義 - 大括號和do-end之間的區別?

irb(main):186:0> print ((1..10).collect do |x| x**2 end) 
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block, 
expecting ')' 
print ((1..10).collect do |x| x**2 end) 
         ^
(irb):186: syntax error, unexpected keyword_end, expecting $end 
print ((1..10).collect do |x| x**2 end) 
            ^
     from /usr/bin/irb:12:in `<main>' 

,而在與相同的功能代碼的作品如預期終止?

irb(main):187:0> print ((1..10).collect { |x| x**2 }) 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil 

我也相信大括號「{}」可以代替「做終端」隨意在塊 定義。

我知道我可以省略打印 方法和第一個括號之間的空間「修復」第一個電話,但我一個解釋 很感興趣,爲什麼它的行爲不同。

+0

另請參見[類似問題的前提](http://stackoverflow.com/questions/2122380/using-do-block-vs-brackets)。 – Zabba 2011-05-30 18:20:14

+0

這是[Ruby Block Syntax Error](http://StackOverflow.Com/q/6854283/)的副本,[傳遞給'each'的代碼塊與括號一起使用,但不與'do'-'end'一起使用(ruby )](http://StackOverflow.Com/q/6718340/),[沒有'do''end的Ruby多行塊]](http://StackOverflow.Com/q/3680097/),[使用'do'塊vs括號'{}'](http://StackOverflow.Com/q/2122380/),[Ruby中這些塊編碼風格的區別或價值是什麼?](http://StackOverflow.Com/q/533008 /)和[Ruby塊和非自私參數](http://StackOverflow.Com/q/420147/)。 – 2011-07-28 08:17:09

+0

@coreyward:Y U回滾? – 2011-09-21 00:00:29

回答

13

不同的是優先級:

# Equivalent to puts((1..10).map { |i| i*2 }) 
> puts (1..10).map { |i| i*2 } 
2 
4 
6 
8 
10 
12 
14 
16 
18 
20 
=> nil 

# Equivalent to puts((1..10).map) { |i| i*2 } 
> puts (1..10).map do |i| i*2 end 
#<Enumerator:0x928f24> 
=> nil 

在第一種情況下,該塊被傳遞給map,一切工作正常。 在第二種情況下,該塊將傳遞給puts,該塊不會執行任何操作。 map沒有收到一個塊,只是返回一個枚舉器。

至於語法錯誤,如果刪除之間print(一切工作的空間;)

不同的是紅寶石是否處理您的括號作爲方法參數的分隔符,或者它是否是一個通用的語句分組。我不確定那裏的確切區別,但它很微妙和煩人

+0

你的第二個例子與問題中的不同。 – sawa 2011-05-30 19:31:10

+0

是的,這只是一個優先的演示,而不是一個直接的解決方案。對不起,如果不明確 – Gareth 2011-05-30 19:36:21

0

有一個終極answer已經在SO上。

不幸的是,這絕對是而不是很好的證明了Ruby背後的驚喜哲學。

相關問題