2009-12-12 14 views
13

Nie mam pojęcia, czy jest to problem z hasłem lub tablicą, ale nie wiem, dlaczego znak gwiazdki (*) jest wymagany w trzecim przykładzie, aby uzyskać wartość mieszającą z danymi. Bez niego wyprowadza pusty hasz.Dlaczego potrzebuję gwiazdki przed tablicą?

# -*- coding: utf-8 -*- 
require 'pp' 
pp [[:first_name, 'Shane'], [:last_name, 'Harvie']] 
# => [[:first_name, "Shane"], [:last_name, "Harvie"]] 

pp [[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten 
# => [:first_name, "Shane", :last_name, "Harvie"] 

pp Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 
# => {:first_name=>"Shane", :last_name=>"Harvie"} 

pp Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 
# => {} 

Poniżej znajduje się wyjaśnienie metody.

--------------------------------------------------------------- Hash::[] 
    Hash[ [key =>|, value]* ] => hash 

    From Ruby 1.8 
------------------------------------------------------------------------ 
    Creates a new hash populated with the given objects. Equivalent to 
    the literal +{ _key_, _value_, ... }+. Keys and values occur in 
    pairs, so there must be an even number of arguments. 

     Hash["a", 100, "b", 200]  #=> {"a"=>100, "b"=>200} 
     Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} 
     { "a" => 100, "b" => 200 }  #=> {"a"=>100, "b"=>200} 

Odpowiedz

30

ikona operator (to znaczy, że *) obraca się, co w przeciwnym razie byłoby tablicę do listy do przypisania w mieszania. Musisz podać operatorowi [] faktyczną listę, aby zamienić pary klucz/wartość wartości mieszania. (Zobacz poniżej link do krótkiego opisu operatora splat, który faktycznie może to zrobić (rozwiń tablicę do listy) lub odwrotnie (zbierz listę w tablicy).)

Sposób, w jaki zrobiłeś to powyżej , podajesz Hash[]nieparzystą liczbę pozycji, a mianowicie pojedynczą tablicę. (Pomyśl o tym, co wytwarza [[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten. Wydaje [:first_name, 'Shane', :last_name, 'Havie'].) Jak mówią cytowane dokumenty, operator [] musi mieć parzystą liczbę elementów. Zauważ, że po (choć bezużyteczny) robi praca:

>> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1] 
=> {[:first_name, "Shane", :last_name, "Harvie"]=>1} 

(To dla mnie jasne, dlaczego nie dostać „nieparzystą liczbę argumentów Hash” błędu przy użyciu kodu masz powyżej - jak możesz zrobić, jeśli spróbujesz Hash[1].)

Prostszy przykład może sprawić, że będzie wyraźniejszy. Po pierwsze, przekazując w jednym elemencie tablicę. Otwarcie tablica z * wręczyć Hash[] listę elementów:

>> Hash[['foo', 'bar', 'bizz', 'buzz']] 
=> {} 
>> Hash[*['foo', 'bar', 'bizz', 'buzz']] 
=> {"foo"=>"bar", "bizz"=>"buzz"} 

Zobacz this blog post dla pełniejszego wyjaśnienia. Użyteczne może być także użycie this short write-up about the splat operator.

+0

Bardzo dziękuję za szczegółowe wyjaśnienie i linki. Teraz w pełni rozumiem, co to jest. Teraz wszystko ma sens. –

Powiązane problemy