Ruby: 在 class 方法中使用模块方法

Ruby: Use module method inside a class method

我们如何在不扩展模块的情况下在 class 方法中使用模块方法?

module TestModule
  def module_method
    "module"
  end
end

class TestClass
  include TestModule

  def self.testSelfMethod
    str = module_method
    puts str
  end
  TestClass.testSelfMethod
end

然后returns:

test.rb:11:in `testSelfMethod': undefined local variable or method `module_method' for TestClass:Class (NameError)

通过包含该模块,您使 module_method 成为 TestClass 上的 instance 方法,这意味着您需要在 TestClass 的实例上调用它=21=],而不是 class 本身。

如果你想让它成为 class 本身的一个方法,你需要 extend TestModule,而不是 include 它。

module TestModule
  def module_method
    "module"
  end
end

class TestClass
  extend TestModule # extend, not include

  def self.testSelfMethod
    str = module_method
    puts str
  end
  TestClass.testSelfMethod # "method"
end

只因评论字数太少,但同意:

module TestModule
  def module_method
    "module"
  end
end

class TestClass

  def self.testSelfMethod
    str = module_method + " from class"
    puts str
  end

  def testSelfMethod
    str = module_method + " from instance"
    puts str
  end
end

TestClass.extend TestModule
TestClass.testSelfMethod # => module from class

TestClass.include TestModule
TestClass.new.testSelfMethod # => module from instance