11
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 キーワードが含まれていないという事実を回避する方法はありますか??

4

4 に答える 4

7

この種の機能が本当に必要な場合は、おそらくリファインメントを使用して実現できます。

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
于 2013-10-19T05:31:57.333 に答える
0

モジュールを含めるかどうかを動的に選択できるクラスを作成する場合は、初期化中にシングルトン クラスにモジュールを含めることで実現できます。

それは、クラス自体にインクルードされたまま、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機能を使用して何をしようとしているのかを真剣に考える価値があります。「動的な包含」のようなもので十分ですか?

于 2019-06-07T18:10:29.213 に答える