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