Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find any methods ancestor chain?

Tags:

ruby

class Taco
  # . . .
end

Get ancestor chain:

Taco.ancestors
 #=> [Taco, Object, Kernel, BasicObject]

Say I want to find the "parent" class and it's ancestor chain for a ruby defined method. How would I go about doing that?

E.g. method_missing.parent.ancestors

And if everything is supposed to inherit from BasicObject why doesn't Kernel?

Object.ancestors
 #=> [Object, Kernel, BasicObject]

Kernel.ancestors
 #=> [Kernel]

BasicObject.ancestors
 #=> [BasicObject]

Also Class inherits from Class and Module but why does my Taco class ancestor's chain not inherit from them and instead inherits directly from Object forward?

Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
like image 880
MrPizzaFace Avatar asked Oct 14 '25 07:10

MrPizzaFace


1 Answers

You are looking for owner.

method(:puts).owner 
  #=> Kernel
method(:puts).owner.ancestors
  #=> [Kernel]

Back to your taco example:

class Taco
  def self.eat
    "YUM"
  end
end

Taco.method(:eat).owner
  #=> #<Class:Taco>
Taco.method(:eat).owner.ancestors
  #=> [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject]

Kernel is an instance of module. Check this out:

Kernel.class.ancestors
  #=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject]

Here is some further reading on the ruby object model if you're interested. Also, here's an image stolen from google images that may help solidify those concepts.

ruby object model

like image 175
Josh Avatar answered Oct 18 '25 05:10

Josh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!