3

我正在编写我的第一个 Ruby 模块,我有这个:

/app/module/test_modules/test.rb

test.rb 看起来类似于:

module TestModules
  module Test

    def test
      puts 'this is a test'
    end
  end
end

当我从控制台调用以下命令时,我得到:

(main)> TestModule::Test.test
//NoMethodError: private method `test' called for TestModules::Test:Module

如何使 test() 可见?

4

4 回答 4

3

您正在调用一个类方法,而您定义test为一个实例方法。如果您通过include或使用模块,您可以按照您想要的方式调用它extend这篇文章很好地解释了。

module TestModules
  module Test
    def self.test
      puts 'this is a test'
    end
  end
end
于 2012-09-04T14:49:59.877 回答
1

还,

1)

module TestModules
  module Test
    def test
      puts 'this is a test'
    end

    module_function :test
  end
end

2)

module TestModules
  module Test
    extend self
    def test
      puts 'this is a test'
    end
  end
end
于 2012-09-04T14:51:09.820 回答
1

您定义方法的方式,它是一个实例上的方法Test- 因此,如果您这样做,它将起作用:

blah = TestModule::Test.new
blah.test

注意- 并以这种方式使用它,您需要将其定义Test为 a classnot amodule

如果您希望该函数在类本身上工作,那么您需要像这样定义它:

def self.test
    ....
end

然后你可以做TestModules::Test.test

于 2012-09-04T14:51:28.737 回答
0

您定义的测试方法是实例方法...试试这个

module TestModules
  module Test
    def self.test
      puts 'this is a test'
    end
  end
end

现在您可以通过此 TestModules::Test.test 调用该方法

于 2012-09-04T14:49:29.157 回答