Domanda

Dato il codice Ruby

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

ho capito tutto nella seconda riga ad eccezione dell'operatore * - che cosa sta facendo e dove si trova la documentazione per questo? (Come si può immaginare, alla ricerca di questo caso si sta rivelando difficile ...)

È stato utile?

Soluzione

Il * è il splat operatore.

Si espande un Array in un elenco di argomenti, in questo caso un elenco di argomenti al metodo Hash.[]. (Per essere più precisi, si espande qualsiasi oggetto che risponde a to_ary / to_a, o to_a in Ruby 1.9.)

Per illustrare, i seguenti due istruzioni sono uguali:

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

Può essere utilizzato anche in un contesto diverso, per la cattura di tutti gli argomenti di metodo che rimangono in una definizione di metodo. In tal caso, non si espande, ma si combinano:

def method2(*args)  # args will hold Array of all arguments
end

Alcune informazioni più dettagliate qui .

Altri suggerimenti

L'operatore splat decomprime un array passato a una funzione in modo che ogni elemento viene inviato alla funzione come un singolo parametro.

Un semplice esempio:

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

Questo è tutto!

Come tutti citano, si tratta di un "splat". Guardando per la sintassi Ruby è impossibile, e ho chiesto questo in altre questioni. La risposta a questa parte della questione è che si esegue una ricerca su

asterisk in ruby syntax

in Google. Google è lì per te, basta mettere quello che si vede in parole.

Anyhoo, come un sacco di codice Ruby, che il codice è abbastanza densa. Il

line.split(/=|;/)

fa una serie di sei elementi, first_name, mickey, last_name, mouse, country, usa. Poi lo splat è usato per fare che in un hash. Ora la gente di Ruby mandano sempre a guardare il metodo Splat, dal momento che tutto è esposto in Ruby. Non ho idea di dove si trova, ma una volta che avete che, vedrete che venga eseguito un for attraverso l'array e costruisce l'hash.

Si potrebbe cercare il codice nel nucleo documentazione . Se non è possibile trovare (non ho potuto), si tenta di scrivere del codice come questo (che funziona, ma non è Ruby-come il codice):

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"]

e quindi la banda di Ruby sarà in grado di dirvi perché il codice è stupido, cattivo, o semplicemente sbagliato.

Se avete letto fino a questo punto, prendere un rel leggere il Hash documentazione per l'inizializzazione.

In sostanza un hash che viene inizializzato con diversi argomenti li crea come coppie di valori chiave:

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

Quindi nel tuo esempio, ciò porterebbe al seguente Hash:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top