何は'モンキ縫うことです。ルビー?
-
23-08-2019 - |
質問
れば、 モンキーパッチ :
この拡張、修正、実行時アクセス コードの動的言語[...] を変えることなく、オリジナルソース コードです。
以下の声明らかに同一の入り混乱してい:
Rubyで、モンキーパッチした 誤解を意味するものではあナ 変更をクラスとは 同義で使われた動的な 修飾クラスを行います。
知りたいと思い の正確な意味猿のパッチングにRubyなどがある。 で行うには、次のようなものか、それとも何か?
class String
def foo
"foo"
end
end
解決
短い答えは、何も「正確な」の意味がないことです。それくらい、少なくともWikipediaの記事から識別することができます。いくつかは、任意のクラスの実行時の変更を参照するためにそれを使用するでしょうが、それが唯一の(ビルトインクラス、私は仮定)、「ランタイム」のコードに適用されると主張する人もがあります。
個人的に、私はより包括的な定義を好みます。我々は唯一の組み込みクラスの変更のための用語を使用した場合結局のところ、どのように我々は他のすべてのクラスの実行時の変更を参照してくださいでしょうか?私にとって重要なことは、ソースコードと実走行のクラスの間に差があるということです。
Rubyでは、用語のモンキーパッチでした 任意のダイナミックを意味する誤解 クラスへの変更と頻繁にあります 動的の同義語として使用 実行時に任意のクラスを変更します。
上記の文では、Rubyの使い方が間違っていると主張している - しかし、用語が進化し、それは常に悪いことではありません。
。他のヒント
最高の説明を聞いたため 猿ぎ/鴨-マシニング加工(縦形) はPatrick Ewingとに RailsConf2007年
...ifで散歩のような合鴨と協議のように鴨、鴨ね。なので この鴨はないんだノイズといってきました。 んパンチとダックまでを返しますが、ご了承ください。
は、をするときモンキーパッチ適用がある置き換えるの実行時にクラスのメソッド(のないの他の人が説明したように、新しいメソッドを追加)。
のコードを変更するには、デバッグ方法に非常に明白で、国連と困難であることに加えて、それはスケールしません。より多くのモジュールが猿のパッチ適用方法、お互いが成長を踏み、変更の可能性を開始してます。
あなたは正しいです。変更または既存のクラスを拡張するのではなく、それをサブクラス化するとき、それはです。
この猿のパッチです:
class Float
def self.times(&block)
self.to_i.times { |i| yield(i) }
remainder = self - self.to_i
yield(remainder) if remainder > 0.0
end
end
今、私はこれが便利な場合があるかもしれないと想像していますが、日常を見たら想像します。
def my_method(my_special_number)
sum = 0
my_special_number.times { |num| sum << some_val ** num }
sum
end
そして、それが呼び出されるときにのみ、の時折の壊れます。これら支払う注意にあなたはすでに理由を知っていますが、.times
クラス・メソッドを持つfloat型について知らなかった、あなたは自動的にmy_special_number
が整数であることを前提とすることを想像してみてください。パラメータは整数、整数または浮動小数点数であるたびに、それが(全体int値は、浮動小数点剰余がある場合を除いて戻される)正常に動作します。しかし、中に小数の領域には何もして番号を渡すと、それは確かに破るよ!
ただ、これはあなたのプロジェクトで、あなたの宝石で起こるのRailsプラグイン、さらには独自の同僚でありますどのくらいの頻度想像してみてください。そこにこのような存在中の1つのまたは2つの小さな方法だとそれが見つけて修正するためにいくつかの時間を取ることができれば。
それが壊れるなぜあなたは不思議に思う場合は、整数および浮動小数点の残りは戻って渡すことができることをsum
に注意してください。種類が同じである場合だけでなく、指数の符号にのみ機能します。あなたが唯一の合計は浮動小数点の結果を取ることができないことを見つけるために...フロートに番号をわざわざ変換するので、あなたは、それが固定だと思うかもしれません。
Python monkeypatchingは多く長い年月を要するかもしれないが恥ずかしい:"っmonkeypatchこのクラスが..."(建築物で、国宝-重要文化での処理時Zope、こ).で使用されると言うことが必要であったに取り付けられているかを確認する上流のクラスで固定し実行時の代わりに働きかけて、不要な行動を固定し、実際のクラスまたは固定して、サブクラス.私の経験はRubyのみなさんお話をmonkeypatchingあれくらいそれくらいどれくらいでないと、特に悪いも注目に値する"鴨ンチング").明らかにする上で注意することに変更する戻り値の方法に使用されるその他の依存関係が、加工方法でクラスのactive_support、側面は完全に安全です。
更新10年後の:私はこの最後の文章とう"と言うことは比較的安全".伸びるコアライブラリのクラスの新しい方法であれば問題は、誰か他の人が同じ考えや追加と同様の方法の異なる実装方法署名の場合、または人々が混乱延長法の核となる語学可能です。場合によく起こるので、Ruby、特にactive_supportられるのである。
通常、それはしばしば低品質のコードで、Rubyのオープンクラスを使用して、アドホック変更について意味している。
、件名に良いフォローアップ:
http://www.infoq.com/articles/ruby-open -classes-monkeypatchingする
説明:
正確な概念の議論は、メーリングリストのそれが必要以上にすぎ学術微妙です。次の例でそれをシンプルに保つのをしてみましょう。
車の通常の動作
どのようにして、通常の車を開始していますか?車が起動し、あなたはイグニッションをオンにし、出来上がりあなたはレースにオフにしている。
:それは簡単です!モンキー車へのパッチ適用
しかし、他の誰かが車とあなたはそれがどのように動作するかを変更したい場合は何を作ったらどう?
あなたはそれらの変更を行うために自動車製造工場に行く必要はありません:あなたは、単に「モンキーパッチ」することができ、それは、ボンネットの下に取得し、surreptiouslyとこそこそ物事を再配線し、ここにあるいくつかのincideniariesを追加することによって。あなたは本当にあなたがこれを行うとそれ以外の結果は非常に爆発することができ、あなたが何をしているかを知っている必要があります - そしておそらくそれが正確に何をしたいのか?
「あなたが行くの?ののFabrizzio、」
ブーム!
「近いあなたのソースコードの近くを保つが、あなたの猿のパッチ。」