【问题标题】:Calling Methods from Inherited Class in Ruby从 Ruby 中的继承类调用方法
【发布时间】:2020-07-13 22:19:13
【问题描述】:

我有以下课程:

模块

module AlertService
    module MessageTemplate
      def generate_message
        "test"
      end
    end
  end

父类:

module Client
  def post uri, params={}
    Net::HTTP.post_form uri, params
  end
end

module AlertService
  class BaseAlert
    extend MessageTemplate
    include Singleton
    include Client
    def initialize; end
  end
end

儿童班:

module AlertService
class TestAlert < BaseAlert
  include Singleton
  def initialize
  options = {
    username: "Screen Alert Bot",
    http_client: Client
  }
  @notifier = Slack::Notifier.new(rails.config.url, options)
  end

  def self.create_message
    message = generate_message
  end

  def self.send_message
    create_message
    @notifier.post blocks: message
  end
end
end

我可以像这样创建测试警报:s= AlertService::TestAlert

但是当我这样做时出现错误:

s.send_message

NoMethodError: undefined method `generate_message' for AlertService::TestAlert::Class

generate_message 是 BaseAlert 类中包含的 MessageTemplate 模块中的一种方法。为什么说我继承的类无权访问该方法?

【问题讨论】:

  • 什么是generate_message?它没有在您的代码中列出。
  • @tadman 这是来自 MessageTemplate 模块的方法

标签: ruby inheritance module singleton


【解决方案1】:

您没有正确使用Singleton。您包含它,但随后不使用它,而是完全绕过它并调用与 Singleton 无关的类方法。它们依次调用父类上不存在的类方法。

解决方案是按预期使用Singleton

module AlertService
  class BaseAlert
    include MessageTemplate
    include Singleton

    def initialize
    end
  end
end

module AlertService
  class TestAlert < BaseAlert
    def initialize
      @notifier = Slack::Notifier.new(Rails.configuration.url, Rails.configuration.options)
    end

    def create_message
      message = generate_message
    end

    def send_message
      create_message
      @notifier.post blocks: message
    end
  end
end

你现在在哪里call with instance as documented

AlertService::TestAlert.instance.send_message

【讨论】:

  • 该格式有意义。我仍然收到方法错误,generate_message NoMethodError: undefined method `generate_section_description'。这是模块中的一个方法,我不知道为什么我不能调用它
  • 你确定是实例方法而不是类方法?此外,如果您在BaseAlert 中需要它,请将include 移动到该类中。我在这里更新了代码。
  • 我会仔细检查我的代码,我还在示例中包含了模块
  • 先检查方法是否真的存在,比如AlertService::TestAlert.instance_methods
  • 哦,我使用的是扩展而不是包含!谢谢!还有一个问题,您是否以正确的方式引用 Client 模块? (我更新了代码以供参考)这是启动通知程序的一个选项,但该类看起来不像它识别模块
猜你喜欢
  • 2015-10-26
  • 1970-01-01
  • 2012-05-28
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多