/ / Comportamento imprevisto dalla parola chiave 'super' di Ruby - eredità di Nokogiri - ruby, ruby-1.9, ruby-1.9.2, ruby-1.8, ruby-1.9.3

Comportamento imprevisto dalla parola chiave 'super' di Ruby - eredità Nokogiri - rubino, rubino-1.9, rubino-1.9.2, rubino-1.8, rubino-1.9.3

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 № 1

Se 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".