Неожиданное поведение из-за ключевого слова 'super' в Ruby - наследование Нокогири - PullRequest
1 голос
/ 26 декабря 2011

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

В этом примере аргументы никогда не должны переадресовываться, поскольку я звоню 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>.

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

1 Ответ

2 голосов
/ 26 декабря 2011

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

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

...