从Ruby中的实例方法调用继承的类方法

时间:2015-08-03 23:46:33

标签: ruby scope class-method instance-method

我有以下Ruby代码:

class B
  class << self
    protected
    def prot
      puts "victory"
    end
  end
end
class C < B
  def self.met
    C.prot
  end
end

C.met

试图证明受保护的类方法是在Ruby中继承的。问题是,如果我将met方法转换为这样的实例方法:

class B
  class << self
    protected
    def prot
      puts "victory"
    end
  end
end
class C < B
  def met
    C.prot
  end
end

c = C.new
c.met
它不会工作。也许它与类和实例方法范围有关?

3 个答案:

答案 0 :(得分:1)

它无法正常工作,因为C的实例不是kind_of?(B.singleton_class)

在ruby中,可以在对象的上下文中调用受保护的方法,该对象是kind_of?定义方法的类,使用显式接收器kind_of?定义方法的类

您在B的单例类上定义了受保护的方法,因此该方法只能在kind_of?(B.singleton_class)的对象中调用。课程C继承B,因此C的单身类会继承B的单身类,因此C为{{{ 1}}。因此,在您的第一种情况下,它是有效的但很明显,kind_of? B.singleton_class不是C.new,所以它不会起作用。

答案 1 :(得分:0)

对于Protected方法,我们可以从属于同一个类的任何对象的范围调用它们。在您的代码片段中,根据类的范围,方法查找链选择该方法,因为它继承到超类。这意味着,您在Singleton类中定义一个方法意味着我们可以通过使用该类的对象来调用它。所以我们可以用A和B的对象来调用它,因为B对象是从A继承的。

总之,您可以在类的公共方法中调用受保护的方法。 请参阅以下网址以获得更好的理解

http://nithinbekal.com/posts/ruby-protected-methods/

accessing protected methods in Ruby

答案 2 :(得分:0)

我认为这与将.protegido方法声明为元类(或单例类)的一部分而不是作为B类本身的一部分的区别有关。

在此处阅读:Metaprogramming in Ruby: It's All About the Self