術-機構:単例類の開def obj.methとclass<<obj;def methの違い

905 ワード

一、単例クラスを開く方法
rubyで単一のクラスを開くには、def obj.methの形式とclass << obj; def methの形式の2つの方法があります.
二、単例クラスを開く方法の違い
通常、2つには違いはありません.唯一の違いは、定数解析の方法で最上位レベルの定数Nがある場合、オブジェクトの単一クラスにNを定義することです.
N = 1 #     N
obj = Object.new
class << obj #  obj      
    N = 2 #obj          N
    def show_N
      puts N
    end
end

def obj.show_N_another_way
    puts N
end

コードを実行すると、次の結果が得られます.
obj.show_N #   2

obj.show_N_another_way  #   1

この違いは定数可視性がコードに及ぼす影響では珍しく,ほとんどの場合,この2つの単一の方法で定義される方法は互いに置き換えられる.しかし、それらの違いを理解することは価値があり、予想外の結果を説明するために使用することができます.
三、提案
1.単一クラスに追加する方法がそれほど多くない場合、単一クラスを開き、単一メソッドを構築するには、短いdef obj.meth形式を使用します.2.単一クラスに追加する方法が多く、または単一クラスにモジュールを追加する必要がある場合、class << obj; def methの形式はより柔軟で美しい.
四、参考資料
1.『Rubyプログラマー修練の道(第2版)』[美]David A.Black--第13章1節(直接検査と修正単例類)