首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby中细化模块方法?

如何在Ruby中细化模块方法?
EN

Stack Overflow用户
提问于 2015-08-20 10:05:24
回答 2查看 2.7K关注 0票数 10

您可以使用

代码语言:javascript
复制
module RefinedString
  refine String do
    def to_boolean(text)
    !!(text =~ /^(true|t|yes|y|1)$/i)
    end
  end
end

但是如何细化模块方法呢?这是:

代码语言:javascript
复制
module RefinedMath
  refine Math do
    def PI
      22/7
    end
  end
end

加薪:TypeError: wrong argument type Module (expected Class)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 20:32:04

这段代码将起作用:

代码语言:javascript
复制
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

解释:

定义模块# method 是在其上定义实例方法的equivalent

票数 16
EN

Stack Overflow用户

发布于 2015-08-20 10:14:39

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

- rdoc.html

一旦您知道您正在做什么,您就有两个选项可以在全球范围内改进模块方法。因为ruby有开放类,所以您可以简单地重写该方法:

代码语言:javascript
复制
▶ Math.exp 2
#⇒ 7.38905609893065
▶ module Math
▷   def self.exp arg
▷     Math::E ** arg
▷   end  
▷ end  
#⇒ :exp
▶ Math.exp 2
#⇒ 7.3890560989306495

是否要保存要覆盖的方法的功能:

代码语言:javascript
复制
▶ module Math
▷   class << self
▷     alias_method :_____exp, :exp  
▷     def exp arg  
▷       _____exp arg    
▷     end  
▷   end  
▷ end  
#⇒ Math
▶ Math.exp 2
#⇒ 7.3890560989306495

请注意副作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32115323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档