0

クラスに独自の動作を追加しようとするとObject、モジュールをユーザー定義クラスに混在させたときに発生しない望ましくない効果が発生します。

module Entity
  def some_instance_method
    puts 'foo'
  end

  def self.secret_class_method
    puts 'secret'
  end

  module ClassMethods
    def some_class_method
      puts 'bar'
    end
  end

  def self.included( other_mod )
    other_mod.extend( ClassMethods )
  end
end

今、私Bobはそれが含まれるようにクラスを作成しますEntity

class Bob; include Entity; end;

これにより、望ましい出力と期待される出力が得られます。

Bob.secret_class_method       #=> NoMethodError
Bob.some_instance_method      #=> NoMethodError
Bob.some_class_method         #=> bar
Bob.new.secret_class_method   #=> NoMethodError
Bob.new.some_instance_method  #=> foo
Bob.new.some_class_method     #=> NoMethodError

しかし、クラスを定義する代わりに、クラスBobを開いて次のようObjectにインクルードする場合:Entity

class Object; include Entity; end

次に、私が見る出力は次のとおりです。

Object.secret_class_method        #=> NoMethodError
Object.some_instance_method       #=> foo
Object.some_class_method          #=> bar
Object.new.secret_class_method    #=> NoMethodError
Object.new.some_instance_method   #=> foo
Object.new.some_class_method      #=> NoMethodError

次に class を定義するBobと、同じように動作します: some_instance_methodclass で呼び出すことができますBob。クラス自体の何かObjectがこのパターンの動作を台無しにしているように見えます。そうでなければ、ここで何か間違ったことをしているだけです。誰かがこの奇妙な振る舞いを説明できますか? Objectすべてのs がインスタンス メソッドをシングルトン メソッドとしても継承するのは望ましくありません。

4

1 に答える 1

1

Bobia オブジェクト (より正確にBobは、 のインスタンスでありClass、 のサブクラスでModuleあり、 のサブクラスでありObject、 のサブクラスであるEntity)、したがって、Entityのメソッドがあります。それが継承の仕組みです。

于 2013-07-16T22:32:38.380 に答える