2013-01-23 76 views
1

我剛剛開始使用Ruby,我希望有一個使用綁定方法作爲我缺少的proc的簡寫。我試圖做到這一點基本上是Ruby:將鍵值數組映射到速記值

SYMBOLS = {"I" => 1, "V" => 5, "X" => 10, ... } 

roman = "zXXIV".upcase.chars.collect { |c| SYMBOLS[c] } 
=> [nil, 10, 10, 1, 5] 

我覺得應該有紅寶石一個簡單的方法,只是使用的符號[]作爲一個綁定方法,所以只是

roman = str.upcase.chars.collect &:SYMBOLS[] 

解決方案的Ruby 1.9 0.3

羅馬= SYMBOLS.values_at(* str.upcase.chars)

回答

2
SYMBOLS.values_at(str.upcase.chars.to_a) 

關於使用SYMBOLS[],您仍然需要將角色傳遞給方法。

可以通過SYMBOLS.method(:[])得到的方法,例如,

> p = SYMBOLS.method(:[]) 
> p.call("X") 
=> 10 

我不相信這是最易讀在這種情況下–對我來說,調用map並傳入SYMBOLS[],而簡潔和功能,延遲了解比我更喜歡的時間。

+0

好,有沒有更一般的方法? – agoebel

+1

@agoebel關於'Hash.values_at'的一般不是什麼? –

+0

猜猜我還需要對紅寶石對象模型有更好的感覺。我只是想知道一般的解決方案,如果我有一個自定義類/方法我想做同樣的事情。 – agoebel

2
SYMBOLS = {"I" => 1, "V" => 5, "X" => 10 } 
roman = "zXXIV" 

p roman.chars.map(&SYMBOLS.method(:[])) 
#=> [nil, 10, 10, 1, 5] 
+0

+1,IMO可能會更好。我未定。我想實際上我認爲'values_at'更具有溝通性。但我的反對意見是溝通,而不是技術。 –