2

いくつかの宝石で、単純require 'some_gem'にメソッドが表示されることに気づきました(私の知る限り、モンキーパッチを適用する必要はありません)。Sinatra、Rake、Rails、その他多くのヘルパーライブラリなどのいくつかの宝石でそれを見てきました。自分のライブラリでこれをどのように達成できるでしょうか。

例:

require 'sinatra'

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

モンキーパッチの場合、モンキーパッチに共通するクラス/モジュール(文字列、数値、配列などを除く)。

4

2 に答える 2

4

Sinatraは基本的にそれらをグローバルメソッドとして追加しています。sinatraが必要な場合は、 sinatra/base.rbで定義されているObjectクラスを拡張します。およびなどのメソッドはベースで定義され、デリゲーターを介して追加されます。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

Kernelまた、どこでも利用できるメソッドを追加するためのモンキーパッチモジュールへの非常に一般的なアプローチ:

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

そしてそれの使用法:

require 'hello.rb'
 => true

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