2009-05-27 69 views
3

這兩個語句是否將相同類型的參數(哈希)傳遞給新方法?Ruby Hashes的括號語法

@seat = Seat.new(:flight_id => @flight.id) 

@seat = Seat.new({:flight_id => @flight.id}) 

哈希括號{}在第二個示例中更改了什麼嗎?

回答

12

它們都是相同的,{}在第二個參數中沒有添加任何內容,除了使事情比以前更加明確外(使用=>語法足以向使用任何人的人說'這是一個散列'紅寶石任何時間長度)。

紅寶石會自動開啓的參數列表,如:

someFunction(:arg1 => value1, :arg2 => value2) 

成散列,並且把它作爲你的一個參數。需要在散列周圍添加散列的時間是當散列的散列或需要兩個散列的函數(如需要傳遞選項和html_options的多個導航方法)時,如下所示:

someFunction({:arg1 => value1, :arg2 => value2}, {:arg3 => value3}) 

它將傳入兩個哈希值(解釋器無法推斷出2個哈希值如果留給它自己的位置,所以您需要給它{}來告訴它在這種情況下該怎麼做)

有關更多信息,請參閱Pickaxe書籍章節:More About Methods,位於底部的收集散列參數部分。

1

這似乎是一個好地方,何況另一個替代語法,使用逗號分隔項目括號(使用範例):

@seat = Seat.new({:flight_id, @flight.id}) 

我通常不使用逗號語法標準碼 - - 就像workmad3所說的那樣,箭頭(=>)使散列更加明顯。但是在一個交互的Ruby會話(IRB),更容易鍵入一個逗號,不是箭頭:

{:eyes, "blue", :height, 6.2} # => {:height=>6.2, :eyes=>"blue"} 

而且在Ruby 1.9中,慣用的版本有更少的逗號:

{eyes: "blue", height: 6.2} 
+0

呀記第二個例子中的語法已經在所有可行的ruby版本中被刪除(1.8版即將發佈) – 2013-03-28 18:16:12