Ruby方法#所有者返回什么?

时间:2014-07-21 08:33:14

标签: ruby

在Ruby 2.1.2p95中,我想检查是否使用在其中定义的相同类或使用子类调用类方法。也就是说,发生了哪些事情:

Parent.my_method

Child.my_method

我试过了:

def self.my_method
  if self == self.method(__method__).owner
    puts "called in Parent"
  end
end

但是self会返回该类的名称,例如'Parent'Method#owner会返回如下内容:

#<Class:Parent>

那么,嗯,那是什么?

是否有一种光滑的方式来测试是从父母还是孩子那里调用某些东西?


为清晰起见更新:我只在父级中定义一个类方法。我没有凌驾于任何事情上。我只是直接(Parent.my_method)或通过子(Child.my_method)调用父类方法,我希望能够区分它。

4 个答案:

答案 0 :(得分:3)

  • 那么,嗯,那是什么?

    这是对类Parent的单例类的检查。类方法被定义为原始类的单例类的实例方法。

  • 是否有一种灵活的方式来测试是从父母或孩子那里调用某些东西?

    <击>是。子类不从其父类继承类方法。因此,如果类方法可以无错误地调用,那么它就在该类实例上定义。如果它引发未定义的错误,则不会在该类实例上定义它。

答案 1 :(得分:1)

我认为这会做你所说的

class Parent
end

class Child < Parent
end

def Parent.my_method
  if singleton_class == method(__method__).owner
    puts "called in Parent"
  end
end

Parent.my_method
Child.my_method

my_method在类Parent的单例类中定义。

使用Parent调用时,它才有效。 如果使用Child进行调用,则会通过Child的单例类和Parent的单例类进行查询。

因为Parent的单身类是Child的单身类的超类。

答案 2 :(得分:0)

我认为这可以解释一切。

#!/usr/bin/env ruby

class Parent
  def something
    klass = self.class
    if klass == Parent
      puts "Instance method called from an instance of Parent class."
    else
      puts "Instance method called from an instance of #{klass} class."
    end
  end

  def self.something
    puts "Class method of #{self} called."
  end
end

class Child < Parent
  def self.something
    puts "Class method of #{self} called."
  end
end

Parent.something
Child.something
Parent.new.something
Child.new.something

输出:

Class method of Parent called.
Class method of Child called.
Instance method called from Parent class.
Instance method called from Child class.

关于你的问题:

  

是否有一种光滑的方式来测试是否正在调用某些内容   来自父母还是孩子?

对于类方法,它不适用,因为该方法只能从类本身的实例(类实例)调用。

对于实例方法,是将它与您声明的实例类进行比较。

答案 3 :(得分:0)

永远永远不必检查self是什么。这只是错误self了解自己,不应该检查。你早上起床照镜子来检查你是谁吗?

这就是多态性的用途:

class Parent; end
class Child < Parent; end

def Parent.my_method; 'Called in Parent' end
def Child.my_method;  'Called in Child'  end

这很简单。