1

Rubysuper关键字的规则是,如果不带参数调用它,则会转发所有原始参数。如果使用显式参数调用它,则显式参数仅传入。

在这个例子中,永远不应该转发参数,因为我是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>标签。

这种情况是否有理由违背预期的行为?

4

1 回答 1

2

如果您查看nokogiri 的源代码,它实际上new是设置节点名称的方法,而不是initialize方法。关于调用没有什么神秘的事情发生,super只是初始化方法对这些参数没有做任何事情。

我认为这是因为该new方法应该为对象分配存储等,在 nokogiri 的情况下,这意味着创建底层 libxml 节点,该节点包含节点名称。

于 2011-12-26T18:00:03.927 回答