module X end module Y end module Z #TODO include X replacement of including Y #TODO include Y replacement of including X end Is there a way to work around the fact that ruby contains no uninclude keyword??
4 Réponses :
Si vous avez vraiment besoin de ce type de fonctionnalité, vous pouvez probablement le faire en utilisant Refinements .
class Foo end module X def x puts 'x' end end module Y end module R refine Foo do include X include Y end end # In a separate file or class using R # Foo now includes X and Y Foo.new.x # In a different file or class # Foo no longer includes X and Y Foo.new.x # NoMethodError
Je ne suis pas trop content de cela, mais cela fonctionne si les deux modules contiennent les mêmes noms de méthodes.
fichier c.rb p> fichier d. RB p> alors p> Pour utiliser ceci, ne pas aussi EDIT: Dans une modification précédente, j'ai ajouté une observation sur charge () code> est juste l'ouverture du module A et Changer et / ou ajouter du code; quelque chose là-bas qu'il ne touche pas reste.
charge () code> n'est pas réel brillant. Je pense que cela fait fondamentalement un
eval () code> et pourrait se soucier de moins s'il charge le même fichier plus d'une fois. P>
besoin code> c.rb ou d.rb. p>
Exiger_relative code>. Sur la réflexion, je vois que ce n'était ni pertinent ni intéressant, alors à la tête. P> p>
La réponse authentique est que, dans Ruby, que ce soit 1.x ou 2.x, il y a aucun mode em> pour non enfoncer un module une fois inclus. Mais je sais que quelqu'un, quelque part a écrit une extension de rubis qui permet des modules non compris. P>
EDIT: OK, en fait, op est le duplicatin de Quel est le contraire de Ruby's incluent? , donc selon sa réponse de @eliah et Banister Les bibliothèques en question sont HTTPS: // github.com/yrashk/rbmodexcl et https://github.com/banister/mixology19< p>
Boris c'est trop vieux que la mélangeologie - s'attendre à des problèmes et je ne suis pas à la hauteur des défis, je suis Checkin Davogones et Cary Answers, charge est Smart Solution, raffinement est plus propre. Si le raffinement a fonctionné pour moi, laisserez certainement le monde savoir qu'il est nécessaire!
Tu as tout à fait raison. Je n'ai pas essayé ces bibliothèques. Je pense qu'il doit y avoir une raison pour laquelle Matz n'a pas fourni cette fonctionnalité en premier lieu.
Si vous souhaitez créer une classe qui peut choisir de choisir de manière dynamique si vous souhaitez inclure ou non un module, vous pouvez y parvenir en incluant le module sur la classe Singleton lors de l'initialisation.
qui ne vous obtiendra pas la même chose que "Unincluding" Le module de la classe Singleton d'un objet, tout en gardant inclus sur la classe elle-même (ce qui se voit à l'esprit pour moi avec non enfoncé code>), mais cela peut correspondre à certaines caractéristiques de la solution de raffinement ci-dessus (que a le même problème) avec un modèle différent si cela suscite des idées pour vous. P>
module A
def hi; :hi; end
end
class Foo
def initialize(include_a = true)
singleton_class.include(A) if include_a
end
end
Foo.new.hi
# => :hi
Foo.new(false).hi
# NoMethodError: undefined method `hi' for #<Foo:0x00007fe19a973f00>
Dupliqué possible de Quel est le contraire de Ruby's Inclure?
@Loganserman Ruby 2.0 Réponse Je cherche
Inclure x remplacement de y compris y i> signifie?
@AruPrakshit Supprimer Y de la chaîne des ancêtres lorsque X et Viceversa inclus
@Aruprakshit Bonne idée :)