2011-08-11 7 views
6

Jaki jest najprostszy sposób przekonwertowania zakresu 1..10 na skrót o następującym formacie?Ruby/Rails: Konwersja zakresu na hasz

{ 
    1 => '£1', 
    2 => '£2', 
    # ... 
} 

Próbowałem robić to z map, ale kończy się z tablicą mieszań niż jednym hash.

Dzięki.

Odpowiedz

12
Hash[(1..10).map { |num| [num, "£#{num}"] }] 

lub

(1..10).inject({}) { |hash, num| hash[num] = "£#{num}"; hash } 

lub w Ruby 1,9

(1..10).each_with_object({}) { |num, hash| hash[num] = "£#{num}" } 
+1

podobne metody 'each_with_object' przypominają mi, jak bardzo kocham Ruby! +1 –

+0

Doskonale, dziękuję! – gjb

+1

musi WŁĄCZYĆ | hash, num | do | num, hash | w tym ostatnim przykładzie ... else get NoMethodError: undefined method '[] = 'for 1: Fixnum – jpwynn

2

Jak o:

h = {} 
(1..10).each {|x| h[x] = "£#{x}"} 
+4

Prosta zasada - za każdym razem, gdy deklarujesz pustą wartość (hash lub tablicę), a następnie iterujesz nad kolekcją, aby ją wypełnić/zsumować - użyj 'inject' – iafonov

+1

@ iafonov..for array, możesz użyć' map'. – rubyprince

+0

@iafonov Zdaję sobie sprawę, że jest to stary post, ale widziałem twój komentarz (i jestem nowy w Ruby), a to po prostu mnie zastanawiało * dlaczego * powinieneś użyć 'inject '. Nie mówię, że to źle, czy cokolwiek, chciałbym po prostu zrozumieć powody tego, że powyższe podejście jest łatwe do odczytania i zrozumienia - i jak rozumiem, wykonuje to zadanie. – Thor84no

1

inny sposób

h = Hash.new { |hash, key| hash[key] = "£#{key}" } 

każdy element będzie mieć odpowiednią wartość hovever będzie również odpowiedzi na h[100] co może powodować Bugs