开发者

Problem with accessing superclass methods in method redefinitions

I am having a bit trouble to understand when "super" can be called and when not. In the below example the super method leads to a no superclass error.

class Bacterium
  def eats
    puts "Nam"
  end
end

class Bacterium
  def eats
    super # -> no superclass error
    puts "Ya开发者_C百科m"
  end
end

b = Bacterium.new
b.eats

But this works:

class Fixnum
  def times
    super # -> works
    puts "done"
  end
end

5.times { |i| puts i.to_s }

Is 5 not just also an instance of Fixnum. And am I not redefining an existing method like in the Bacterium example above?


No, not really. Fixnum inherits from Integer class, and you are in fact overriding Integer#times, so super works, as it calls implementation from the parent.

In order to achieve something similar when monkeypatching, you should alias method before redefining it, and there call it by alias.

class Bacterium
  alias_method :eats_original, :eats
  def eats
    eats_original # -> "Nam"
    puts "Yam"
  end
end

Class reopening is not a form of inheritance and super is of no use there.


Just as Mladen said, and you can check that with Class#superclass:

irb> Fixnum.superclass
=> Integer

And does Integer implement #times?:

irb> Integer.instance_methods.grep /times/
=> [:times]

Yes it does.

So, in a simplified way, we can say, that super invokes the method you are in of a superclass. In your case the superclass of a Bacterium is Object, which doesn't implement #eats.

I said this is very simplified, because look at this example:

module One
  def hi
    " World" << super()
  end
end

module Two
  def hi
    "Hello" << super()
  end
end

class SayHi
  def hi
    "!!!"
  end
end

h = SayHi.new
h.extend(One)
h.extend(Two)

puts h.hi

#=> Hello World!!

Don't take to serious what I wrote here, it is actually tip of the iceberg of the Ruby object model, which is important to understand (I am still learning it) - then you will get most, or all of those concepts.

Use some Google-fu for "Ruby object model"...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜