Le regole di Ruby "s super
la parola chiave è che se viene chiamato senza argomenti, tutti gli argomenti originali vengono inoltrati. Se viene chiamato con argomenti espliciti, gli argomenti espliciti vengono trasmessi esclusivamente.
In questo esempio, gli argomenti non dovrebbero mai essere inoltrati, poiché sto chiamando super
con argomenti esatti.
Esempio:
@doc = Nokogiri::HTML::DocumentFragment.parse("<body></body>")
class Cat < Nokogiri::XML::Node
def initialize(arg1, arg2)
super("cat", arg2) # Pass arg2 to super
# Do something with arg1 later
end
end
Quando si chiama: Cat.new("dog", @doc)
Mi aspetto di tornare a <cat></cat>
tag e mi aspetto che il primo argomento venga ignorato. Invece sto ricevendo un <dog></dog>
etichetta.
C'è un motivo per cui questo caso sfiderebbe il comportamento previsto?
risposte:
2 per risposta № 1Se guardi il fonte di nokogiri, in realtà è il new
metodo che imposta il nome del nodo, non il initialize
metodo. Non sta accadendo nulla di misterioso riguardo all'invocazione super
, è solo che il metodo di inizializzazione non fa nulla con quegli argomenti.
Presumo che questo sia perché new
il metodo è quello che dovrebbe essereallocare memoria e così via per l'oggetto, che nel caso di nokogiri significa creare il nodo libxml sottostante, che è la cosa che contiene "s il nome del nodo".