2013-10-19 4 views
10
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キーワードが含まれていないという事実を回避する方法はありますか?Ruby 2.0モジュールを組み込んだ後、モジュールからモジュールを取り出すにはどうしたらいいですか?

enter image description here

+0

可能重複している[Rubyのの反対が含まれている何?] (http://stackoverflow.com/questions/2088211/what-is-the-opposite-of-rubys-include) –

+0

@LoganSerman ruby​​ 2.0答え私は – zotherstupidguy

+0

を検索します* Yは*を含むXの置換を含みますか? –

答えて

5

あなたは本当にこの種の機能が必要な場合は、おそらくrefinementsを使用することによってそれを行うことができます。

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

私はこれに満足しているわけではありませんが、両方のモジュールに同じメソッド名が含まれていればうまくいきます。

ファイルc.rb

module A 
    def me 
    puts "I am C" 
    end 
    def whosit? 
    puts "It's me, Becky" 
    end 
end 

module A 
    def me 
    puts "I am D" 
    end 
end 

そして

class X 
    load('c.rb') 
    include A 
end 

x = X.new 

x.me # => I am C 
x.whosit? # => It's me, Becky 
load('d.rb') 
x.me # => I am D 
x.whosit? # => It's me, Becky !! Unwanted !! 
load('c.rb') 
x.me # => I am C 
load()

d.rbファイルだけ、モジュールAを開き、変更および/またはコードを追加しています。そこには触れないものが残っています。 load()は本当に明るくありません。私は基本的にeval()を実行し、同じファイルを2回以上読み込むと気にする必要がないと思います。

これを使用するには、require c.rbまたはd.rbも使用しないでください。

編集:以前の編集では、私はrequire_relativeについての観測を追加しました。反射では、私はそれが関連性も面白くもなく、その頭部でも外れているのを見る。

1

本物の答えは、Rubyでは1.xまたは2.xであることです。はありません。は一度含まれていればモジュールを取り除きます。しかし、誰かがどこかにRuby拡張モジュールを書いていて、モジュールを組み込むことができないことを知っています。

EDIT:OK、実際には、OPはWhat is the opposite of Ruby's include?の複製であるので、その答えに応じて@eliahbanisterによって問題の図書館はのhttps://github.com/yrashk/rbmodexclhttps://github.com/banister/mixology19

+0

ボリスはミックスロジーと同じくらい古いです - 予想の問題と私はCのチャレンジまではありません、私はチェックインしていますdavogones&負荷はスマートな解決策です。洗練された洗練されたものです。もし洗練が私のために働くなら、間違いなくそれが必要であることを世界に知らせるでしょう! – zotherstupidguy

+0

あなたは絶対に正しいです。私はそれらのライブラリを試していません。私はMatzが最初にこの機能を提供しなかった理由がなければならないと思う。 –

関連する問題