2017-08-13 1 views
0

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 

Répondre

2

Rubocop se plaint de @@class_variable style. les variables de classe utilisation peut être refactorisé en utilisant la variable d'instance d'une classe:

class SomeClass 
    @some_variable ||= [] 
end 

au lieu de

class SomeClass 
    @@some_variable ||= [] 
end 

Vous pouvez définir la variable d'instance d'une classe dans un endroit où self égal à l'objet de classe. Par exemple, dans une méthode de classe:

module MyModule 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    def run_fixers 
    ClassMethods.fixers.each(&:call) 
    end 

    module ClassMethods 
    def self.fixers 
     @fixers ||= [] 
    end 

    def fix(_name, &block) 
     ClassMethods.fixers << block 
    end 
    end 
end 
+0

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/)) . –