module X
end
module Y
end
module Z
#TODO include X replacement of including Y
#TODO include Y replacement of including X
end
ruby に uninclude キーワードが含まれていないという事実を回避する方法はありますか??
module X
end
module Y
end
module Z
#TODO include X replacement of including Y
#TODO include Y replacement of including X
end
ruby に uninclude キーワードが含まれていないという事実を回避する方法はありますか??
この種の機能が本当に必要な場合は、おそらくリファインメントを使用して実現できます。
class Foo
end
module X
def x
puts 'x'
end
end
module Y
end
module R
refine Foo do
include X
include Y
end
end
# In a separate file or class
using R
# Foo now includes X and Y
Foo.new.x
# In a different file or class
# Foo no longer includes X and Y
Foo.new.x # NoMethodError
モジュールを含めるかどうかを動的に選択できるクラスを作成する場合は、初期化中にシングルトン クラスにモジュールを含めることで実現できます。
それは、クラス自体にインクルードされたまま、1 つのオブジェクトのシングルトン クラスのモジュールを「アンインクルード」するのと同じことにはなりません (これは、私がuninclude
. (同じ問題があります)それがあなたにいくつかのアイデアを刺激する場合は、別のパターンで。
module A
def hi; :hi; end
end
class Foo
def initialize(include_a = true)
singleton_class.include(A) if include_a
end
end
Foo.new.hi
# => :hi
Foo.new(false).hi
# NoMethodError: undefined method `hi' for #<Foo:0x00007fe19a973f00>
これは古い質問であることを理解してください。ただし、機能を探している場合は、uninclude
機能を使用して何をしようとしているのかを真剣に考える価値があります。「動的な包含」のようなもので十分ですか?