在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)调用父类方法,我希望能够区分它。
答案 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
这很简单。