Je veux créer un DSL qui stocke divers blocs, puis peut les appeler. Je veux que ce soit un module réutilisable que je peux inclure dans plusieurs classes.Comment puis-je utiliser les variables d'instance de classe dans un module étendu dans Ruby?
J'ai trouvé un moyen de le faire en utilisant des variables de classe, mais rubocop se plaint et dit que je devrais utiliser des variables d'instance de classe à la place. Je ne peux pas trouver un moyen de le faire cependant. C'est possible?
module MyModule
def self.included(base)
base.extend(ClassMethods)
end
def run_fixers
ClassMethods.class_variable_get(:@@fixers).each(&:call)
end
module ClassMethods
def fix(_name, &block)
@@fixers ||= []
@@fixers << block
end
end
end
class MyClass
include MyModule
def initialize
run_fixers
end
fix 'test' do
puts 'testing'
end
end
Bonne réponse. Envisagez de remplacer la première phrase par une brève explication de la raison pour laquelle Robocop suggère l'utilisation d'une variable d'instance de classe plutôt qu'une variable de classe, avec éventuellement un lien vers une explication plus complète (comme la réponse de Brent [https: // stackoverflow. com/questions/15773552/ruby-classe-instance-variable-vs-classe-variable) ou [ce blog] (http://thoughts.codegram.com/understanding-class-instance-variables-in-ruby/)) . –