ruby on rails - Confusion with super -
override to_xml.
what difference between these codes. can explain proper example ?
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
tl;dr: super behaves in unexpected ways, , variables matter, not objects.
when super called, it's not called object passed in.
it's called variable called options @ time of call. example, following code:
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 which produces output
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: {} you can see secondchild super method called variable options refers fixnum of value 42, not object referred options.
with using options.merge!, you'd modify hash object passed you, means object referred variable original_child_options modified, can seen in original child options after method called: {:methods=>[:murm_case_name, :murm_type_name]} line.
(note: changed options 42 in secondchild, rather call hash#merge, because wanted show wasn't merely case of side effects on object)
Comments
Post a Comment