2013-08-01 13 views
10

stavo navigando attraverso il Camping codebase quando ho visto un costruttore con un simbolo viene utilizzato in questo modo:Cosa fa un operatore di splat quando non ha un nome di variabile?

class Fruit 
    def initialize(*) 
    end 
end 

Ho provato a guardare "splat senza nome variabile" su questo sito e di Google, ma non potevo' t trovare qualcosa oltre a informazioni su splat utilizzato con un nome variabile come questo *some_var, ma non senza di esso. Ho provato a giocare con questo su un repl, e ho provato cose come:

class Fruit 
    def initialize(*) 
     puts * 
    end 
end 

Fruit.new('boo') 

ma che corre in questo errore:

(eval):363: (eval):363: compile error (SyntaxError) 
(eval):360: syntax error, unexpected kEND 
(eval):363: syntax error, unexpected $end, expecting kEND 

Se questa domanda non è stato chiesto già, qualcuno può spiegare cosa fa questa sintassi?

risposta

8

In genere uno splat come questo viene utilizzato per specificare argomenti che non vengono utilizzati dal metodo ma che vengono utilizzati dal metodo corrispondente in una superclasse. Ecco un esempio:

class Child < Parent 
    def do_something(*) 
    # Do something 
    super 
    end 
end 

Questo dice, chiamare questo metodo nella classe super, passandogli tutti i parametri che sono stati dati al metodo originale.

fonte: programmazione Ruby 1.9 (Dave Thomas)

+0

Questo è solo un caso speciale di ciò che Josnidhin menziona. – sawa

4

Si comporta simile a args *, ma non puoi fare riferimento al metodo di poi nel corpo

def print_test(a, *) 
    puts "#{a}" 
end 

print_test(1, 2, 3, 'test') 

questo stampa 1.

Problemi correlati