为什么我无法从模块调用 parent-class 方法?

Why am I not able to call a parent-class method from module?

这是我的 code:

module RubyEditExtComponent
    def eventExt
        watchExt "banana"
    end
end

class RubyEditExt
    def self.watchExt(value)
        puts value
    end

    include RubyEditExtComponent
end

RubyEditExt.new.eventExt

我想调用一个特定的(父)class 方法来输出我将传递给它的值。但它说 undefined method watchExt

我哪里错了?

watchExt 是从实例方法中调用的,因此它本身应该是一个实例方法:

class RubyEditExt
  def watchExt(value) # NO self
    puts value
  end
  ...
end

或者它应该被称为 class 方法:

module RubyEditExtComponent
  def eventExt
    self.class.watchExt "banana"
  end
end

可能是,您正在尝试做的是使用模块 RubyEditExtComponent 中的功能扩展您的 class RubyEditExt。这与继承无关(ChildClass < ParentClass)。通常你这样做是为了模块化功能,这让你的 classes 保持干净并且模块可以重用。这样的模块称为mixins。

参见下面的示例。通过这种方式,您可以使用实例方法扩展 class,您可以为 class 的每个对象调用这些方法,或者为 class 定义包含模块的 class 方法。

module RubyEditExtComponent
  def self.included(klass)
    klass.instance_eval do
      include InstanceMethods
      extend ClassMethods
    end
  end

  module InstanceMethods
    def eventExt
      watchExt "banana"
    end
  end

  module ClassMethods
    def eventExt2
      self.new.watchExt "banana"
    end
  end
end

class RubyEditExt
  include RubyEditExtComponent

  def watchExt(value)
    puts value
  end
end

方法self.included 在包含模块(include RubyEditExtComponent) 时调用,它接收包含它的class。现在您可以为 class:

的对象调用实例方法
RubyEditExt.new.eventExt
banana
 => nil

或者你调用class方法。在这个方法中,我创建了一个包含模块 (self == RubyEditExt) 的 class 的实例 (self.new),然后我为它调用实例方法 watchExt

RubyEditExt.eventExt2
banana
=> nil