11
votes

RUBY 2.0 Comment puis-je résoudre un module d'un module après l'inclusion?

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??

5 commentaires

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 signifie?


@AruPrakshit Supprimer Y de la chaîne des ancêtres lorsque X et Viceversa inclus


@Aruprakshit Bonne idée :)


4 Réponses :


7
votes

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


0 commentaires

0
votes

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 xxx

fichier d. RB xxx

alors xxx

charge () 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 () n'est pas réel brillant. Je pense que cela fait fondamentalement un eval () et pourrait se soucier de moins s'il charge le même fichier plus d'une fois.

Pour utiliser ceci, ne pas aussi besoin c.rb ou d.rb.

EDIT: Dans une modification précédente, j'ai ajouté une observation sur Exiger_relative . Sur la réflexion, je vois que ce n'était ni pertinent ni intéressant, alors à la tête.


0 commentaires

1
votes

La réponse authentique est que, dans Ruby, que ce soit 1.x ou 2.x, il y a aucun mode 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.

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<


2 commentaires

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.



0
votes

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>


0 commentaires