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: {}
您可以看到SecondChild
super 方法是使用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
,因为我想表明这不仅仅是对对象产生副作用的情况)