如何在Ruby中改进模块方法?

如何在Ruby中改进模块方法?,ruby,ruby-2.0,ruby-2.1,ruby-2.2,Ruby,Ruby 2.0,Ruby 2.1,Ruby 2.2,您可以使用 module RefinedString refine String do def to_boolean(text) !!(text =~ /^(true|t|yes|y|1)$/i) end end end 但如何细化模块法? 这: 引发:TypeError:错误的参数类型模块(应为类) 细化只修改类,而不修改模块,因此参数必须是类 - 一旦您意识到您正在做什么,您就有两个选项来全局优化模块方法。由于ruby具有开放类,您可以简单地重写该方法: ▶

您可以使用

module RefinedString
  refine String do
    def to_boolean(text)
    !!(text =~ /^(true|t|yes|y|1)$/i)
    end
  end
end
但如何细化模块法? 这:

引发:
TypeError:错误的参数类型模块(应为类)

细化只修改类,而不修改模块,因此参数必须是类

-

一旦您意识到您正在做什么,您就有两个选项来全局优化模块方法。由于ruby具有开放类,您可以简单地重写该方法:

▶ Math.exp 2
#⇒ 7.38905609893065
▶ module Math
▷   def self.exp arg
▷     Math::E ** arg
▷   end  
▷ end  
#⇒ :exp
▶ Math.exp 2
#⇒ 7.3890560989306495
是否要保存要覆盖的方法的功能:

▶ module Math
▷   class << self
▷     alias_method :_____exp, :exp  
▷     def exp arg  
▷       _____exp arg    
▷     end  
▷   end  
▷ end  
#⇒ Math
▶ Math.exp 2
#⇒ 7.3890560989306495
▶ 模块数学
▷   类这段代码将起作用:
说明:

定义一个模块#方法就是在它的#singleton_类

上定义一个实例方法,那么有没有办法改进模块的方法呢?目前没有办法改进模块,正如我在链接的文档中明确指出的那样,除了使用精确的
refine
方法之外,可能还有其他解决方案,而这正是我所寻求的
▶ module Math
▷   class << self
▷     alias_method :_____exp, :exp  
▷     def exp arg  
▷       _____exp arg    
▷     end  
▷   end  
▷ end  
#⇒ Math
▶ Math.exp 2
#⇒ 7.3890560989306495
module Math
  def self.pi
    puts 'original method'
   end
end

module RefinementsInside
  refine Math.singleton_class do
    def pi
      puts 'refined method'
    end
  end
end

module Main
  using RefinementsInside
  Math.pi #=> refined method
end

Math.pi #=> original method