2009-01-07 97 views
9

我提取簡單的例子:紅寶石塊和括號的參數

require 'pp' 
x = 1..3 
pp x.map do |i| {:value => i, :double => (i*2)} end 
pp x.map { |i| {:value => i, :double => (i*2)} } 

pp(x.map do |i| {:value => i, :double => (i*2)} end) 
pp(x.map { |i| {:value => i, :double => (i*2)} }) 

我想知道爲什麼第一頁生產:

[1, 2, 3] 

雖然所有的oders是給:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}] 

我假定它與運算符優先級有關。我在哪裏可以找到很好的解釋?

+2

這是[Ruby Block Syntax Error](http://StackOverflow.Com/q/6854283/)的副本,[傳遞給`each`的代碼塊與括號但是不能與`do`-`end(ruby)](http://StackOverflow.Com/q/6718340/),[塊定義 - 大括號和``````end`之間的區別?](http:/ /StackOverflow.Com/q/6179442/),[沒有`do``結尾的Ruby多行塊]](http://StackOverflow.Com/q/3680097/),[使用`do`塊vs括號`{} ](http://StackOverflow.Com/q/2122380/)和[這些塊代碼風格在Ruby中的區別或價值是什麼?](http://StackOverflow.Com/q/533008/)。 – 2011-07-28 08:19:01

+0

在此發佈日期使用Ruby-2.2.0進行pry會話的部分內容。 pp_hash = x.map do | i | {:value => i,:double =>(i * 2)} end => [{:value => 1,:double => 2},{:value => 2,:double => 4} ,{:value => 3,:double => 6}] pp_hash.join(「,」) 「{:value => 1,:double => 2},{:value => 2, double => 4},{:value => 3,:double => 6}「 這可能更適合Json的今天使用,但這只是讀取輸出的風格問題。有時,只要你的代碼能夠處理正確的類型,你會傳遞哪一個並不重要。 pp_hash = pp_hash.join(「,」) – 2015-02-18 18:29:26

回答

14

這是因爲你調用

pp x.map 

,並傳遞到第一個塊(這可以忽略它)

正如Programming Ruby

牙套具有較高的優先級解釋;有很低的優先級

因此,有效地,大括號與最接近它們的函數調用(x.map)綁定,而綁定最遠(pp)。這有點簡單但它應該解釋這種情況