Fare un hash da una matrice - come funziona?
Domanda
fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]
Hash[*fruit]
=> {"apple"=>"red", "banana"=>"yellow"}
Perché lo splat causa della matrice da così bene analizzato nel Hash?
O, più precisamente, come fa il Hash "sa" che "mela" è la chiave e "rosso" è il suo corrispondente valore?
E 'semplicemente perché sono in posizioni consecutive nella matrice di frutta?
Ha importanza che il simbolo è qui utilizzato? Può un hash non definirsi da un Arry così direttamente altrimenti?
Soluzione
Come la href="http://www.ruby-doc.org/core/classes/Hash.src/M002839.html" rel="noreferrer"> documentazione afferma:
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}
Non può passare un array alla documentazione metodo Hash[]
secondo, quindi la splat è solo un modo per esplodere l'array fruit
e superare i suoi elementi come normali argomenti al metodo Hash[]
. In effetti questo è un uso molto comune dell'operatore splat.
La cosa interessante è che, se si tenta di passare un numero dispari di argomenti Hash si otterrà un'eccezione ArgumentError
:
fruit = ["apple","red","banana","yellow","orange"]
#=> ["apple", "red", "banana", "yellow", "orange"]
Hash[*fruit] #=> ArgumentError: odd number of arguments for Hash
Altri suggerimenti
Guarda il metodo della classe pubblico []
in classe Hash. (Say, qui.) Essa afferma chiaramente che viene creato un nuovo Hash (esempio) e popolato con gli oggetti dati. Naturalmente, si verificano in coppie. L'operatore splat espande essenzialmente un array quando viene utilizzato come parametro.