Angenommen, ich habe ein Modul mit den Methoden: function1, function2, function3. Ich möchte Funktion 1 und Funktion 2, aber nicht Funktion 3 importieren. Gibt es eine Möglichkeit, dies in Rubin zu tun?Wie kann ich nur ein paar Funktionen von einem Ruby-Modul importieren?
7
A
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
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.
Ich hatte so etwas im Sinn, aber ich dachte, vielleicht gibt es einen saubereren Weg. – Geo