在 Ruby 个模块中使用辅助方法

Using helper methods in Ruby modules

我在理解如何将我自己的辅助方法合并到 Ruby 模块时遇到一些问题。

我的代码:

module MyModule
  def self.foo
    bar
  end

  def bar
    # helper for MyModule.foo
  end
end

MyModule.foo
#=> NameError: undefined local variable or method `bar' for MyModule:Module

我不确定为什么 MyModule 无法识别 bar 方法。我忽略了 Ruby 范围的哪一方面?

模块可以作为 mixins 集成到 classes 中。因此,您需要将它包含在 class 中,以便它可以与 class.

实例 一起使用

截至目前,您可以将 bar 作为您的模块方法,以便按原样访问它。

module MyModule
  def self.foo
    bar
  end
  def self.bar
     puts "Now it works"
  end
end
MyModule.foo #=> Now it works

Ruby Docs

A Module is a collection of methods and constants. The methods in a module may be instance methods or module methods. Instance methods appear as methods in a class when the module is included, module methods do not.

您正在尝试从 class 方法调用实例方法。你必须写

module MyModule
  def MyModule.foo
    MyModule.bar
  end

  # Or you can have it this way
  def MyModule::bar
    # helper for MyModule.foo
  end
end

MyModule.foo

得到你想要的。

你错过了方法的范围(模块和实例),基本上它是生命周期..

模块方法方式:- 以下是如何使用模块方法定义模块。

 module MyModule
    def self.foo
        puts "called self.foo"
        bar
    end

    def self.bar
        puts "self.bar got called"
        # helper for MyModule.foo
    end
end

现在,这样一来,您就不必实例化任何对象来调用这些方法。下面是调用这些方法的方式(一个在另一个内部)

MyModule.foo

使用 class 实例化模块和调用方法将不起作用,因为它们不是实例方法。

输出-

called foo
bar got called

实例方法方式:- 以下是您将如何使用实例方法定义模块,以便它们在 classes 和对象之间工作..

module MyModule
  def foo
      puts "called foo"
      bar
  end

  def bar
    puts "bar got called"
    # helper for MyModule.foo
  end
end

class TestModule
  include MyModule
end

选择以这种方式使用模块方法,您必须按照以下方式调用模块内部的方法 -

#instantiating module MyModule via class
myinstance = TestModule.new
myinstance.foo

输出-

called foo
bar got called