在Ruby模块中访问方法

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()函数可见?


NoMethodError: 由 http://apidock.com/ruby/Kernel/test 引起,私有方法'test'被调用于TestModules::Test:Module。 - sumskyi
为什么会有人点踩?我能做些什么来改进这个问题吗? - doremi
可能是因为这是一个非常简单的 Ruby 问题,而你误解了发生的事情。 - Robert K
4个回答

3
你正在调用一个类方法,但是你将test定义为实例方法。如果使用includeextend通过模块调用,你可以按照你想要的方式进行调用。这篇文章讲解得非常好:点击此处
module TestModules
  module Test
    def self.test
      puts 'this is a test'
    end
  end
end

它不起作用。当我调用TestModules :: Test.test时,我得到相同的错误。 - doremi
@doremi 你使用的 Ruby 版本是什么?它可以在 Ruby 1.9.2-p290 上运行。 - Robert K
Ruby 1.9.3p194 - 我刚刚重启了控制台,现在出现了不同的错误。可能是因为我弄坏了其他东西。我正在寻找解决方法... - doremi
你知道为什么我不能调用TestModule::Test.new.test吗?我得到了undefined method `new' for TestModule::Test::Module。 - doremi
TestModules: Test是一个模块,而不是一个类(我认为模块继承自类,但我很确定模块的实例不会暴露新内容)。 - Cubic

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

我之前不知道 module_function 方法,这很有趣。但我认为第二种方法并不明智;虽然它能够工作,但如果有人不知道它的存在,可能会让他们陷入困境。 - Robert K
“extend self” 是使模块可测试的常见做法。 - sumskyi

1

根据您定义的方法,它是在Test实例上的一个方法 - 因此,如果您执行以下操作,则会起作用:

blah = TestModule::Test.new
blah.test

注意 - 如果您想以这种方式使用它,您需要将Test定义为一个class而不是一个module

如果您希望该函数在类本身上起作用,则需要这样定义:

def self.test
    ....
end

然后你可以执行TestModules::Test.test


0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接