Dat codul Ruby
line = "first_name=mickey;last_name=mouse;country=usa"
record = Hash[*line.split(/=|;/)]
Am înțeles totul, în al doilea rând, în afară de *
operator ce face și unde este documentația pentru asta? (ca s-ar putea ghici, în căutarea pentru acest caz se dovedește a fi greu...)
Caracterul " * " este splat operator.
Se extinde o "Matrice" într-o listă de argumente, în acest caz, o listă de argumente pentru Hașiș.[] metoda. (Pentru a fi mai precis, se extinde orice obiect care răspunde la to_ary
/`to_a", sau " to_a în Ruby 1.9.)
Pentru a ilustra, următoarele două afirmații sunt egale:
method arg1, arg2, arg3
method *[arg1, arg2, arg3]
Acesta poate fi, de asemenea, utilizat într-un context diferit, pentru a prinde toate celelalte metoda de argumente într-o definiție metodă. În acest caz, aceasta nu se extinde, dar combina:
def method2(*args) # args will hold Array of all arguments
end
Bulină operator despachetează o matrice a trecut la o funcție, astfel încât fiecare element este trimis la funcția ca un parametru individual.
Un exemplu simplu:
>> def func(a, b, c)
>> puts a, b, c
>> end
=> nil
>> func(1, 2, 3) #we can call func with three parameters
1
2
3
=> nil
>> list = [1, 2, 3]
=> [1, 2, 3]
>> func(list) #We CAN'T call func with an array, even though it has three objects
ArgumentError: wrong number of arguments (1 for 3)
from (irb):12:in 'func'
from (irb):12
>> func(*list) #But we CAN call func with an unpacked array.
1
2
3
=> nil
Ca's a!
Ca toată lumea menționează, l's, un "splat". În căutarea pentru Ruby sintaxa este imposibil, și am'am cerut acest lucru în alte întrebări. Răspunsul la această întrebare este că de căutare pe
asterisk in ruby syntax
în Google. Google este acolo pentru tine, pune doar ceea ce vezi în cuvinte.
Oricum, ca o mulțime de Ruby cod, acel cod este destul de densă. La
line.split(/=|;/)
face o serie de ȘASE elemente, first_name, mickey, last_name, mouse-ul, țară, statele unite ale americii
. Apoi bulină este folosit pentru a face asta într-un Hash. Acum Ruby oamenii întotdeauna te-a trimis la Bulină metodă, deoarece tot ceea ce este expus în Ruby. Nu am nici o idee unde este, dar odată ce ai făcut asta, ai'll vedea că se execută un "pentru" prin matrice și se bazează hash.
V-ar căuta codul în core documentație. Dacă nu puteți găsi (nu am putut), ar încerca să scrie un cod de genul asta (care funcționează, dar NU este Ruby-cum ar fi codul):
line = "first_name=mickey;last_name=mouse;country=usa"
presplat = line.split(/=|;/)
splat = Hash.new
for i in (0..presplat.length-1)
splat[presplat[i]] = presplat[i+1] if i%2==0
end
puts splat["first_name"]
și apoi, Ruby gasca va fi în măsură să vă spun de ce codul este prost, rău, sau pur și simplu greșit.
Daca'am citit acest departe, să ia o citesc prin Hash documentația pentru inițializare.
Practic un hash care este inițializat cu mai multe argumente le creează ca perechi de valori-cheie:
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Deci, în exemplu, aceasta ar putea conduce la următoarele Hash:
{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}