2009-03-31 6 views

答えて

6

あなたが望むメソッドを追加するだけのクリーンな方法があるのか​​どうかはわかりませんが、望ましくないメソッドはundef_methodを使って削除できます。

module Foo 
    def function1 
    end 

    def function2 
    end 

    def function3 
    end 
end 

module MiniFoo 
    include Foo 
    not_wanted_methods = Foo.instance_methods - %w(function1 function2) 
    not_wanted_methods.each {|m| undef_method m} 
end 

class Whatever 
    include MiniFoo 
end 
+0

私はこのようなことを気にしていましたが、もっとクリーンな方法があると思いました。 – Geo

5

類似のソリューションですが、より自動化されています。私は何が起こることができる奇妙なことのどのような種類のか分からない。

module Foo 
    def m1 
    puts "Hello from m1" 
    end 

    def m2 
    puts "Hllo from m2" 
    end 
end 

class Module 
    alias :__include__ :include 
    def include(mod, *methods) 
    if methods.size > 0 
     tmp = mod.dup 
     new_mod = Object.const_set("Mod#{tmp.object_id}", tmp) 
     toremove = new_mod.instance_methods.reject { |m| methods.include? m.to_sym } 
     toremove.each { |m| new_mod.send(:undef_method, m) } 
     __include__(new_mod) 
    else 
     __include__(mod) 
    end 
    end 
end 

class Bar 
    include Foo 
end 

class Baz 
    include Foo, :m2 
end 

bar = Bar.new 
baz = Baz.new 
p bar.methods - Object.methods 
p baz.methods - Object.methods 

=> 

["m1", "m2"] 
["m2"] 
4

あなたがモジュールのソースコードを制御しているとすれば、最もクリーンな方法は、モジュールをより多くのモジュールに分割することです。

モジュールの一部だけが必要な場合は、そのモジュールを、より少ない責任を持つ複数のモジュールにリファクタリングすることができます。

関連する問題