2009-03-31 10 views

Antwort

6

Nicht sicher, ob es einen sauberen Weg gibt, nur die gewünschten Methoden hinzuzufügen, aber Sie können die Methoden, die Sie nicht wollen, mit undef_method entfernen.

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

Ich hatte so etwas im Sinn, aber ich dachte, vielleicht gibt es einen saubereren Weg. – Geo

5

Ähnliche Lösung, aber ein bisschen mehr automatisch. Ich habe keine Ahnung, was für seltsame Dinge passieren können.

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

Angenommen, Sie den Quellcode an das Modul steuern, ich glaube, der sauberste Weg, um das Modul in mehr, äh, modularen Stücke aufzuteilen wäre.

Wenn Sie nur einige Teile eines Moduls möchten, ist das ein gutes Zeichen, dass Sie dieses Modul in mehrere Module mit weniger Verantwortung umwandeln können.