A *
significa "tutti i parametri rimanenti". Un _
è solo un altro nome di variabile, anche se è un po 'speciale. Quindi sono diversi, ad esempio, il seguente non ha senso:
[[1, 2, 3], [4, 5, 6]].each{|*, x, *| p x} # Syntax error
In effetti, come è Rubino dovrebbe sapere se la prima stella dovrebbe avere 0, 1 o 2 dei valori (e viceversa)?
Ci sono pochissimi casi in cui si desidera utilizzare una stella per ignorare i parametri. Un esempio potrebbe essere se si desidera utilizzare solo l'ultimo di un numero variabile di parametri:
Rubino consente di non dare un nome al "resto" dei parametri, ma è possibile utilizzare _
:
[[1], [2, 3], [4, 5, 6]].each{|*_, last| p last} # => prints 1, 3 and 6
in genere, il numero di parametri è nota e la scelta migliore è quella di utilizzare un _
:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid} # prints 2 and 5
Nota che si potrebbe lasciare l'ultimo unna paramater med troppo (come è possibile quando si utilizza un *
), anche se è meno evidente:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, | p mid} # prints 2 and 5
Ora _
è il designato nome della variabile da utilizzare quando non si desidera utilizzare un valore. Si tratta di un nome di variabile speciale per due motivi:
- Rubino non si lamenterà se non ne fanno uso (se gli avvertimenti sono)
- Rubino vi permetterà di ripetere che nella lista degli argomenti.
Esempio del punto 1:
> ruby -w -e "def foo; x = 42; end; foo"
-e:1: warning: assigned but unused variable - x
> ruby -w -e "def foo; _ = 42; end; foo"
no warning
Esempio del punto 2:
[[1, 2, 3], [4, 5, 6]].each{|unused, mid, unused| p mid}
# => SyntaxError: (irb):23: duplicated argument name
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid}
# => prints 2 and 5
Infine, come nota @DigitalRoss, _
tiene l'ultimo risultato in irb
Aggiornamento: In Ruby 2.0, è possibile utilizzare qualsiasi variabile che inizi con _
per indicare che non è utilizzato. In questo modo il nome della variabile può essere più esplicito su ciò che viene ignorato:
_scheme, _domain, port, _url = parse_some_url
# ... do something with port
Grazie per la risposta dettagliata.Questa risposta ha tutte le informazioni che volevo. – sawa