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 № 1Jeś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.