2012-02-24 10 views
19

Mam tablicę ciągów znaków i chcę utworzyć z niej skrót. Każdy element tablicy będzie kluczem i chcę, aby wartość była obliczana z tego klucza. Czy istnieje sposób Ruby to zrobić?Tablica ruby ​​do hasza: każdy element klucza i wyprowadzenie z niego wartości

Na przykład:

['a','b'] przekonwertować do {'a'=>'A','b'=>'B'}

+0

Czy struny są unikatowe? A jeśli tak nie jest? Czy chcesz wyjątek? –

+0

tak, będą wyjątkowe. Jeśli nie są, zrobię to wcześniej. – lulalala

Odpowiedz

49

Można:

a = ['a', 'b'] 
Hash[a.map {|v| [v,v.upcase]}] 
+4

to na pewno działa ... ale nie sądzę, że jest to * najbardziej * wydajne ... iterujesz dwa razy w tym przypadku. Oczywiście nie dotyczy to tablicy o długości 2, ale wciąż warto zauważyć. – brad

4

Oto naiwne i proste rozwiązanie, które przekształca bieżący znak symbol być używany jako klucz. I dla zabawy kapitalizuje wartość. :)

h = Hash.new 
['a', 'b'].each {|a| h[a.to_sym] = a.upcase} 
puts h 

# => {:a=>"A", :b=>"B"} 
1

Nie wiem, czy to jest prawdziwa Ruby sposób, ale powinna być wystarczająco blisko:

hash = {} 
['a', 'b'].each do |x| 
    hash[x] = x.upcase 
end 

p hash # prints {"a"=>"A", "b"=>"B"} 

Jako funkcja mielibyśmy to:

def theFunk(array) 
    hash = {} 
    array.each do |x| 
    hash[x] = x.upcase 
    end 
    hash 
end 


p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"} 
3

Który kiedykolwiek sposób spójrz na to, będziesz musiał powtórzyć początkową tablicę. Oto kolejny sposób:

a = ['a', 'b', 'c'] 
h = Hash[a.collect {|v| [v, v.upcase]}] 
#=> {"a"=>"A", "b"=>"B", "c"=>"C"} 
21
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a} 
+0

Podoba mi się twoje rozwiązanie! Bardzo śliczne! –

0

Oto kolejny sposób:

a.zip(a.map(&:upcase)).to_h 

#=>{"a"=>"A", "b"=>"B"} 
1

each_with_object metoda Ruby jest schludny sposób robienia tego, co chcesz

['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase } 
Powiązane problemy