/ / Nieoczekiwane zachowanie słowa kluczowego "super" Rubiego - Dziedziczenie Nokogiri - ruby, ruby-1,9, rubin-1,9, ruby-1,8, ruby-1.9.3

Nieoczekiwane zachowanie słowa kluczowego "super" Rubiego - dziedziczenie Nokogiri - ruby, ruby-1.9, ruby-1.9.2, ruby-1.8, ruby-1.9.3

Zasady Ruby super słowem kluczowym jest to, że jeśli zostanie wywołany bez argumentów, wszystkie pierwotne argumenty zostaną przekazane dalej. Jeśli jest wywoływana z jawnymi argumentami, jawne argumenty są przekazywane wyłącznie.

W tym przykładzie argumenty nigdy nie powinny być przekazywane, ponieważ dzwonię super z dokładnymi argumentami.

Przykład:

@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

Podczas dzwonienia: Cat.new("dog", @doc) Spodziewam się odzyskać <cat></cat> i oczekuję, że pierwszy argument zostanie zignorowany. Zamiast tego dostaję <dog></dog> etykietka.

Czy istnieje powód, dla którego ten przypadek byłby sprzeczny z oczekiwanym zachowaniem?

Odpowiedzi:

2 dla odpowiedzi № 1

Jeśli spojrzeć na źródło do nokogiri, to faktycznie jest new metoda, która ustawia nazwę węzła, a nie nazwę węzła initialize metoda. Nie ma nic tajemniczego w związku z przywoływaniem super, po prostu metoda initialize nie robi nic z tymi argumentami.

Zakładam, że to dlatego, że new metoda jest tą, która ma byćprzydzielanie pamięci i tak dalej dla obiektu, który w przypadku nokogiri oznacza utworzenie odpowiedniego węzła libxml, który jest elementem, który zawiera nazwę tego węzła.