ruby - 向 Ruby 类添加的方法在 MiniTest 中抛出 NoMethodError

标签 ruby namespaces metaprogramming minitest

那么为什么会发生这种情况呢?它必须是命名空间错误,我只是不明白它在哪里。我在文件 file.rb 中像这样向 Fixnum 添加了一个方法

module M
  class Fixnum
    def foo
      return true
    end
  end
end

然后我会做一个这样的测试:
require 'minitest/autorun'
require './file.rb' #the path is correct

class SomeTest < MiniTest::Test
  def test_foo
    assert 3.foo
  end
end

这将反过来抛出一个
NoMethodError: undefined method `foo' for 3:Fixnum

当我运行测试时,即使我include M 也让我摸不着头脑。包含模块(应用命名空间?)进行测试它仍然会引发错误。我可以很好地使用自定义类,只有当我尝试将方法添加到现有的“开放类”时。

最佳答案

是的,您已经定义了自己的 M::Fixnum实际上与::Fixnum无关的类在全局命名空间中。以下将解决一个问题:

module M
  class ::Fixnum
    def foo
      return true
    end
  end
end

5.foo
#⇒ true

请注意,在上面的代码中 module M没有意义,因为代码仍然猴子修补全局 Fixnum .此处的代码只是为了展示如何从另一个模块代码内部对全局类进行猴子修补。

另外,Ruby2 引入了 refinements , 很可能 what you are intended to use .

关于ruby - 向 Ruby 类添加的方法在 MiniTest 中抛出 NoMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28778175/

相关文章:

ruby - 上传/发布 stringIO 作为文件

c++ - 为什么 ADL 不适用于 Boost.Range?

ruby-on-rails - 使用命名空间编辑 simple_form_for

Python,将Python代码字符串导入为模块

Ruby:STDIN.gets 是什么意思?

ruby - RVM Gemsets 和 Ruby Gemfile 混淆

ruby - 检测 eventmachine 断开连接并测试重新连接

vb.net - 使用 VB.NET 在两个程序集中定义相同命名空间的解决方法

javascript - 有没有办法在 JavaScript 中检查父/调用对象?

c++ - "Enable_if"结构数据成员