0

覆盖 to_xml。

这些代码有什么区别。有人可以用适当的例子来解释吗?

1.

def to_xml(options = {})
  options.merge!(:methods  => [ :murm_case_name, :murm_type_name ])
  super
end

2.

def to_xml(options = {})
  super
  options.merge!(:methods  => [ :murm_case_name, :murm_type_name ])
end
4

2 回答 2

4

tl; dr: super以意想不到的方式表现,变量很重要,而不仅仅是对象。

super被调用时,它不会与传入的对象一起调用。

使用调用时调用的变量options调用它。例如,使用以下代码:

class Parent
  def to_xml(options)
    puts "#{self.class.inspect} Options: #{options.inspect}"
  end
end

class OriginalChild < Parent
  def to_xml(options)
    options.merge!(:methods  => [ :murm_case_name, :murm_type_name ])
    super
  end
end

class SecondChild < Parent
  def to_xml(options)
    options = 42
    super
  end
end

begin
  parent_options, original_child_options, second_child_options = [{}, {}, {}]
  Parent.new.to_xml(parent_options)
  puts "Parent options after method called: #{parent_options.inspect}"
  puts
  OriginalChild.new.to_xml(original_child_options)
  puts "Original child options after method called: #{original_child_options.inspect}"
  puts
  second_child_options = {}
  SecondChild.new.to_xml(second_child_options)
  puts "Second child options after method called: #{second_child_options.inspect}"
  puts
end

产生输出

Parent Options: {}
Parent options after method called: {}

OriginalChild Options: {:methods=>[:murm_case_name, :murm_type_name]}
Original child options after method called: {:methods=>[:murm_case_name, :murm_type_name]}

SecondChild Options: 42
Second child options after method called: {}

您可以看到SecondChildsuper 方法是使用options引用 aFixnum的变量调用的42,而不是使用最初引用的对象options

使用 using options.merge!,您将修改传递给您的哈希对象,这意味着变量引用的对象original_child_options现在已被修改,如该Original child options after method called: {:methods=>[:murm_case_name, :murm_type_name]}行所示。

(注意:我options在 SecondChild 中改为 42,而不是 call Hash#merge,因为我想表明这不仅仅是对对象产生副作用的情况)

于 2010-11-16T00:00:00.840 回答
2

第一个返回 super 调用的结果。所以这就像你从来没有在你的情况下做某事。

在您的更改和更改选项之后的第二次调用 super。

我想你真的想要:

def to_xml(options = {})
  super(options.merge!(:methods  => [ :murm_case_name, :murm_type_name ]))
end
于 2010-11-15T16:57:20.753 回答