2015-08-14 30 views

回答

3

使用Hash的映射和使用Array#map得到映射一個新的數組:

mapping = {2 => 'b', 3 => 'a' } 
[1,2,3,2,4,5,3,7,8].map { |x| mapping.fetch(x, x) } 
=> [1, "b", "a", "b", 4, 5, "a", 7, 8] 
7
arr = [1,2,3,2,4,5,3,7,8] 
h = { 2=>'b', 3=>'a' } 

h.default_proc = ->(_,k) { k } 
h.values_at(*arr) 
    #=> [1, "b", "a", "b", 4, 5, "a", 7, 8] 
+0

什麼 - >符號做 –

+0

穆罕默德,這就是[「stabby」(http://isotope11.com/blog/stabby-lambda )語法來編寫lambda,這是在Ruby v1.9中引入的。正如你所看到的,我用方法[Hash#default_proc =](http://ruby-doc.org/core-2.2.0/Hash.html#method-i-default_proc-3D)。 –

+2

我喜歡你把問題徹底解決的方式。 –

1

這裏的另一種可能的解決方案,類似於@falsetru's answer

mapping = Hash.new {|_, v| v }.merge(2 => 'b', 3 => 'a') 
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping.method(:[])) 
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8] 

Feature #11262 – Make more objects behave like "Functions"上Ruby問題跟蹤器,我建議HashES應該像從鍵到值的函數那樣工作,即它們應該執行NT callto_proc,這樣可以讓您直接與變換函數傳遞mappingmap

[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping) 
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8] 

直到我的建議得到實施(這可能是「從不」,考慮到沒有人即使看着它2個月),你需要這個猴子補丁得到它的工作:

module HashAsFunction 
    refine Hash do 
    alias_method :call, :[] 

    def to_proc 
     method(:call).to_proc 
    end 
    end 
end 

using HashAsFunction 
相關問題