Supponiamo di avere un modulo con i metodi: function1, function2, function3. Voglio importare function1 e function2 ma non function3. C'è un modo per farlo in rubino?Come posso importare solo un paio di funzioni da un modulo Ruby?
7
A
risposta
6
Non sono sicuro se c'è un modo pulito per aggiungere solo i metodi desiderati, ma è possibile rimuovere i metodi che non si desidera utilizzando 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
Soluzione simile ma un po 'più automatica. Non ho idea di che tipo di cose strane possa accadere però.
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
Supponendo di controllare il codice sorgente per il modulo, penso che il modo più pulito sarebbe quello di dividere il modulo in per uh, pezzi di più, modulari.
Se si desidera solo alcune parti di un modulo, è un buon segno che è possibile rifattorizzare quel modulo in più moduli che hanno meno responsabilità.
Avevo in mente qualcosa di simile, ma pensavo che forse esistesse un modo più pulito. – Geo