Supposons que j'ai un module avec les méthodes: function1, function2, function3. Je veux importer function1 et function2 mais pas function3. Y a-t-il un moyen de faire ça à ruby?Comment puis-je importer seulement quelques fonctions d'un module Ruby?
7
A
Répondre
6
Vous ne savez pas s'il existe une méthode propre pour ajouter simplement les méthodes souhaitées, mais vous pouvez supprimer les méthodes que vous ne voulez pas en utilisant 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
5
Solution similaire mais un peu plus automatique. Je n'ai aucune idée du genre de choses bizarres qui peuvent arriver.
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
En supposant que vous contrôlez le code source au module, je pense que la manière la plus propre serait de diviser le module en morceaux plus, euh, modulaires.
Si vous voulez seulement certaines parties d'un module, c'est un bon signe que vous pouvez refactoriser ce module en plusieurs modules qui ont moins de responsabilités.
Je pensais à quelque chose comme ça, mais je pensais qu'il existait peut-être un moyen plus propre. – Geo