2009-12-12 14 views
13

Bunun bir Hash sorunu ya da bir Array sorunu olup olmadığı hakkında hiçbir fikrim yok, ancak veriyle dolu bir karma almak için üçüncü örnekte neden yıldız işareti (*) işareti gerektiğini anlamıyorum. Bu olmadan, boş bir karma üretir.Diziden önce neden yıldıza ihtiyacım var?

# -*- 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] 
# => {} 

Aşağıda, yöntemin açıklaması yer almaktadır.

--------------------------------------------------------------- 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} 

cevap

30

uyarısı operatörü (diğer bir deyişle, * olan) olarak karma içinde atama için bir liste halinde bir dizi olacağını döner. [] operatörüne bir karma anahtar/değer çiftine dönüşen gerçek bir liste vermelisiniz. (Aslında bunu yapabilecek (bir diziyi bir listeye dahil edin) veya tersini (bir dizinin bir listesini toplayın) kısa bir açıklamasının bağlantısı için aşağıya bakın.)

Yukarıda yaptığınız gibi. öğelerine tek bir dizi verirsiniz. ([[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten'un ne ürettiğini düşünün. Bu, [:first_name, 'Shane', :last_name, 'Havie'] verir.) Teklif ettiğiniz dokümanlar, [] operatörünün çift sayıda öğe içermesi gerekir. Not (yararsız olsa da) yapar aşağıdaki eser: Yukarıdaki sahip kodunu kullanılırken

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

(Size hata "Hash için argümanların tek sayı" alamadım bana neden belirsiz - olarak Hash[1]'yi denerseniz yaparsınız.)

Daha basit bir örnek daha net hale getirebilir. İlk olarak, bir öğeden geçerek, bir dizi.

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

daha eksiksiz bir açıklama için this blog post bakınız: * ile dizi açılması öğelerin listesini Hash[] el. Ayrıca this short write-up about the splat operator yararlı bulabilirsiniz.

+0

Detaylı açıklamanız ve linkleriniz için çok teşekkürler. Şimdi bunun ne olduğunu tam olarak anlıyorum. Şimdi her şey mantıklı. –

İlgili konular