2011-12-26 3 views
1

Правила ключевого слова Ruby's super состоят в том, что если он вызывается без аргументов, все исходные аргументы пересылаются. Если он вызывается с явными аргументами, то явные аргументы передаются исключительно.Неожиданное поведение от ключевого слова Ruby 'super' - Наследование Nokogiri

В этом примере аргументы никогда не должны пересылаться, так как я вызываю super с точными аргументами.

Пример:

@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 

При вызове: Cat.new("dog", @doc) я ожидаю, чтобы получить обратно <cat></cat> тег, и я ожидаю, что первый аргумент игнорируется. Вместо этого я получаю тег <dog></dog>.

Есть ли причина, по которой этот случай будет игнорировать ожидаемое поведение?

+0

Вы пропустили тег ruby-1.9.3 ;-) – Howard

ответ

2

Если вы посмотрите на source to nokogiri, это фактически метод new, который устанавливает имя узла, а не метод initialize. Ничего загадочного не происходит при вызове super, это просто, что метод initialize ничего не делает с этими аргументами.

Я предполагаю, что это связано с тем, что метод new - это тот, который предполагается распределять для хранения и т. Д. Для объекта, что в случае nokogiri означает создание базового узла libxml, который является тем, что содержит имя узла.

+0

Спасибо, на основании этого похоже, что невозможно переопределить метод 'new' с помощью обычных средств. –