2009-11-13 9 views
36

linięRuby: co robi gwiazdki w "p * 1..10" oznaczają

p *1..10 

robi dokładnie to samo, co

(1..10).each { |x| puts x } 

co daje następujący wynik:

$ ruby -e "p *1..10" 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

to świetny skrót podczas pracy z tekstem, na przykład, ale co robi gwiazdka? Jak to działa? nie można znaleźć niczego w sieci ...

Odpowiedz

60

Jest to splat operator. Często będziesz widzieć, jak dzieli się tablicę na parametry do funkcji.

def my_function(param1, param2, param3) 
    param1 + param2 + param3 
end 

my_values = [2, 3, 5] 

my_function(*my_values) # returns 10 

Częściej stosuje się go przyjąć dowolną liczbę argumentów

def my_other_function(to_add, *other_args) 
    other_args.map { |arg| arg + to_add } 
end 

my_other_function(1, 6, 7, 8) # returns [7, 8, 9] 

Działa również do wielokrotnego przypisania (chociaż oba te sprawozdania będą działać bez ikona):

first, second, third = *my_values 
*my_new_array = 7, 11, 13 

Na przykład te dwa elementy będą równoważne:

p *1..10 
p 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
+1

Wydaje mi się, że a, b, c = * moje wartości jest odpowiednikiem a, b, c = moje wartości lub czy ruby ​​domyślnie używa operatora splat w tym przypadku? –

+0

@Patrick Tak, zadanie, w którym znajduje się jeden obiekt z jednej strony, a wiele obiektów z drugiej będzie w pewnym sensie implikować operatora splat. To chyba nie jest bardzo przydatny przykład. – Neall