2

我在一些 gems 中注意到,当你简单地require 'some_gem',方法会出现(没有任何猴子修补我的知识)。我已经在 Sinatra、Rake、Rails 和许多其他帮助库等的一些 gem 中看到了它。如何在自己的图书馆中实现这一目标?

例子:

require 'sinatra'

# Automatically recieve the 'get' method
get('/') { "I was monkeypatched or included automatically." }

如果是猴子补丁,猴子补丁常见的类/模块(字符串、数字、数组等除外)。

4

2 回答 2

4

Sinatra 本质上是将它们添加为全局方法。当您需要 sinatra 时,它会扩展在sinatra/base.rb中定义的 Object 类。诸如和之类的方法在 base 中定义,并通过委托者添加。Sinatra::Delegatorgetput

于 2012-05-14T12:23:34.017 回答
3

除了 Beerlington 的回答,Rails,例如,特别是它的一部分 ActiveSupport,使用完全猴子补丁。

例如,blank?来自 ActiveSupport 源的方法声明(已剥离):

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

此外,monkeypatchKernel模块的非常常见的方法是添加随处可用的方法:

# hello.rb
module Kernel
  def say_hello
    "Hello!"
  end
end

以及它的用法:

require 'hello.rb'
 => true

say_hello
 => "Hello!"
于 2012-05-14T12:31:20.207 回答