Ruby 为什么我不能从模块中调用父类方法?

Ruby 为什么我不能从模块中调用父类方法?,ruby,module,class-method,Ruby,Module,Class Method,这是我的: 我想调用一个特定的(父)类方法,该方法将输出我将传递给它的值。但是它说未定义的方法watchExt 我错在哪里?watchExt是从实例方法调用的,因此它应该是实例方法本身: class RubyEditExt def watchExt(value) # NO self puts value end ... end 或者应将其称为类方法: module RubyEditExtComponent def eventExt self.class.watc

这是我的:

我想调用一个特定的(父)类方法,该方法将输出我将传递给它的值。但是它说
未定义的方法watchExt


我错在哪里?

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

class RubyEditExt
  def watchExt(value) # NO self
    puts value
  end
  ...
end
或者应将其称为类方法:

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

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

class RubyEditExt
  def watchExt(value) # NO self
    puts value
  end
  ...
end
或者应将其称为类方法:

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

可能是,您正在尝试使用模块
RubyEditExtComponent
的功能扩展类
RubyEditExt
。这与继承无关(ChildClass 请参见下面的示例。通过这种方式,您可以使用实例方法扩展类,您可以为类的每个对象调用实例方法,或者为包含模块的类定义类方法

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
在包含模块时调用(
includerubyeditextcomponent
),并接收包含它的类。现在,您可以为类的对象调用实例方法:

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

RubyEditExt.eventExt2
banana
=> nil

可能是,您正在尝试使用模块
RubyEditExtComponent
的功能扩展类
RubyEditExt
。这与继承无关(ChildClass 请参见下面的示例。通过这种方式,您可以使用实例方法扩展类,您可以为类的每个对象调用实例方法,或者为包含模块的类定义类方法

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
在包含模块时调用(
includerubyeditextcomponent
),并接收包含它的类。现在,您可以为类的对象调用实例方法:

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

RubyEditExt.eventExt2
banana
=> nil

嗯,我需要使用单个“关键字”(在本例中,单个关键字是
watchExt
)从
实例方法调用
类方法。我该怎么做?这是另一个问题,你介意表达一下你想要达到的目标吗?一种方法是
self.class.public\u发送:watchExt,“banana”
。坦率地说:我不完全理解这些要求。“使用单个关键字”是什么意思?我想在实例方法中使用自定义的“关键字”,以执行某些任务。因此,在本例中,“myPrinter”将在控制台上放置自定义文本。我所处的环境(例如)编写“watch”将在其控制台上打印文本(因此,基本上使用自定义设置执行put)。我需要同样的。然后
self.class.public\u发送:watchExt,“香蕉”
应该满足您的要求。atom
:watchExt
可以动态设置。但是我应该把它放在哪里呢?“香蕉”是一个动态的字符串。现在我可以写
watchExt“banana”
,而不是
watchExt“hello”
上面的一些行。它就像一个记录器……嗯,我需要使用一个“关键字”(在本例中,单个关键字是
watchExt
)从
实例方法调用
类方法。我该怎么做?这是另一个问题,你介意表达一下你想要达到的目标吗?一种方法是
self.class.public\u发送:watchExt,“banana”
。坦率地说:我不完全理解这些要求。“使用单个关键字”是什么意思?我想在实例方法中使用自定义的“关键字”,以执行某些任务。因此,在本例中,“myPrinter”将在控制台上放置自定义文本。我所处的环境(例如)编写“watch”将在其控制台上打印文本(因此,基本上使用自定义设置执行put)。我需要同样的。然后
self.class.public\u发送:watchExt,“香蕉”
应该满足您的要求。atom
:watchExt
可以动态设置。但是我应该把它放在哪里呢?“香蕉”是一个动态的字符串。现在我可以写
watchExt“banana”
,而不是
watchExt“hello”
上面的一些行。它有点像一个伐木工人。。。