在Ruby模块中使用辅助方法

时间:2015-01-17 16:15:52

标签: ruby oop methods module scope

我在理解如何将自己的帮助器方法合并到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中范围的哪个方面?

2 个答案:

答案 0 :(得分:1)

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

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

得到你想要的东西。

答案 1 :(得分:0)

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

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

 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

使用类来实例化Module并调用方法将不起作用,因为它们不是实例方法。

输出 -

called foo
bar got called

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

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