首页 > 解决方案 > 使用 ruby​​ 改进时的 NoMethodError

问题描述

我正在使用 ruby​​ 的改进将一个方法猴子修补到 Math 类中,如下所示:

module Radians
  refine Math do
    def radians(degrees)
      degrees * Math::PI / 180
    end
  end
end

然后我尝试在这样的类中调用我的猴子补丁方法:

class Foo
  using Radians
  def bar
    Math.radians(180)
  end
end

Foo.new.bar

这会抛出一个undefined method `radians' for Math:Module (NoMethodError)

我究竟做错了什么?我的红宝石版本是2.5.1p57. 我查阅了文档,我认为我所做的是正确的,但显然不是。

标签: ruby

解决方案


您正在定义一个实例方法,但调用一个单例方法。

您需要改进 Math 模块的单例类:

module Radians
  refine Math.singleton_class do
    def radians(degrees)
      degrees * Math::PI / 180
    end
  end
end

推荐阅读