私は自分のクラス (またはモジュールのように振る舞う)を階層の間BasicObjectに挿入する方法を目指しています (または、モジュールのように動作します)。これは私のテスト設定です:ObjectObjects
module Entity
# Define the singleton method Entity::new such that it generates and returns
# a class which extends Entity.
def self.new(*args, &blk)
c = Class.new(*args, &blk)
c.extend self
c
end
# Singleton method
def self.foo
puts 'foo'
end
# Instance method
def bar
puts 'bar'
end
end
次に、 s のクラスThingを作成すると、希望する出力に近づきます。includeEntity
thing = Thing.new
thing.bar #=> bar
Thing.foo #=> NoMethodError
のインスタンスは でThing定義したインスタンス メソッドを継承しますEntityが、クラスは残念ながらThingのシングルトン メソッドを継承しません。Entity
クラスEntityを開いて を含めてすべてのオブジェクトに動作を追加しようとすると、すべてのオブジェクトが のインスタンス メソッドを継承するだけでなく、シングルトン メソッドとしても継承します。ObjectEntityEntity
class Object; include Entity; end
Object.bar #=> bar
Object.new.bar #=> bar
class Bob; end
Bob.bar #=> bar
Bob.new.bar #=> bar
これは私が欲しいものではありません。すべてのオブジェクトが で定義されている動作を定義Entityどおりに継承するようにしたいので、Objectinheritのインスタンス メソッドのインスタンスと、標準の継承と同様に、inheritのシングルトン メソッドEntityから継承するクラスが生成されます。これを達成するために行ったことをどのように変更できますか?ObjectEntity