如何为ruby中的模块覆盖一个类?

le_*_*_me 0 ruby oop syntax

为什么这不起作用?

module Magic
  class Fixnum
    def div2(other)
      self.to_f / other
    end

    alias :"/" :div2
  end
end

module SomeModule
  include Magic

  1/4 == 0.25 #should be true in here
end

1/4 == 0.25 #should be false everywhere else
Run Code Online (Sandbox Code Playgroud)

Dan*_*ers 5

你自己发布的答案实际上是Fixnum全球变化,这不是你想要的.也就是说,使用您的解决方案:

module Magic
  class ::Fixnum
    def div2(other)
      self.to_f / other
    end

    alias :"/" :div2
  end
end

# Yields 0.25 instead of expected 0. 
# This line should not be affected by your Fixnum change, but is.
1/4 
Run Code Online (Sandbox Code Playgroud)

对于您描述的用例,Ruby 2.0引入了改进,您可以使用如下所示.请注意,using在Ruby 2.0中不能使用另一个模块中的模块,但是在Ruby 2.1中.因此,要使用Magic内部模块,SomeModule您将需要Ruby 2.1.如果您使用Windows,这可能是一个问题,因为您必须自己编译2.1,Windows二进制文件和安装程序仍然是2.0.

module Magic
  refine Fixnum do
    def /(other)
      self.to_f / other
    end
  end
end

1/4 # => 0
using Magic
1/4 # => 0.25
Run Code Online (Sandbox Code Playgroud)