在Ruby中应用细化功能

时间:2014-02-24 04:00:33

标签: ruby

我正在尝试在HTTP类中改进'get'方法但没有成功。
我期望在输出中得到'HTTP#get in Faker';但程序在Net :: HTTP中运行原始的'get'方法。
我们是否允许在Ruby 2.1中执行以下代码?

require 'net/http'
module Faker
  refine Net::HTTP do
    def self.get(dummy)
      puts "HTTP#get in Faker"
    end
  end
end

using Faker
uri = URI('http://www.google.com')
x = Net::HTTP.get(uri)

2 个答案:

答案 0 :(得分:1)

可以通过您要优化的类的singleton_class来细化类方法:

require 'net/http'

module Faker
  refine Net::HTTP.singleton_class do
    def get(dummy)
      puts "HTTP#get in Faker"
    end
  end
end

using Faker
uri = URI('http://www.google.com')
x = Net::HTTP.get(uri)

答案 1 :(得分:0)

我找到了解决问题的方法。
我们可以使用这个技巧改进类方法:

这里是:

require 'net/http'
include Net
module Faker
  refine Class do
    def HTTP.get(dummy)
      puts "HTTP#get in M"
    end
  end
end

using Faker
uri = URI('http://www.google.com')
x = HTTP.get(uri)