2016-02-05 36 views
-1

我遇到了一種方法,其中程序提取了對象的name屬性,並發現語法有點奇怪。這是處理JSON響應的結果。Ruby或Rails數組迭代語法

我們的JSON響應將是以下=

[{"id"=>9, "name"=>"Baked Potato w/ Cheese", "instructions"=>nil}, 
{"id"=>12, "name"=>"Baked Brussel Sprouts", "instructions"=>nil}] 

results = JSON.parse(response.body) 

def extract_name 
    ->(object) { object["name"] } 
end 

results.map(&extract_name) 

所以我很理解results.map(&extract_name)返回JSON對象的name,我只是不明白怎麼樣。

我不熟悉->(object) { object["name"] }語法。是否還有其他簡寫方法可以幫助我更好地理解這種類型的語法?

+2

@ sschmeck的回答是不錯的,但值得注意的是,這不是偉大的代碼。每次調用'extract_name'時,此代碼都會初始化一個新的lambda。將lambda分配給一個變量或常數比較好,例如, 'EXTRACT_NAME = - >(object){object [「name」]}; results.map(&EXTRACT_NAME)'。 –

+1

@Jordan:你確定嗎?我非常肯定'e.map(&m)'會被解析爲'e.map(&(m()))'所以'm'只會被調用一次,然後'&'會被應用到它的僅返回一次值。 –

+1

是的,你是正確的,但我寫的是「這個代碼每次調用'extract_name'時都會初始化一個新的lambda。」每次迭代都不會調用它,但每次調用「results.map(&extract_name)」時都會調用它。 –

回答

2

箭頭->是創建lambas的簡短語法。參見「What do you call the -> operator in Ruby?」。

的另一種方式可能是下面的代碼片段:

results.map { |object| object["name"] } 
+0

'object [:name]'應該是'object [「name」]'與OP的代碼等價。 –

+0

@Jordan好的,謝謝。更新了我的答案。 – sschmeck