2017-08-13 51 views
0

我想創建一個存儲各種塊的DSL,然後可以調用它們。我希望這是一個可以重複使用的模塊,可以包含在多個類中。如何在Ruby的擴展模塊中使用類實例變量?

我想出了一種使用類變量的方法,但rubocop抱怨並且說我應該使用類實例變量。我無法弄清楚這樣做的方法。可能嗎?

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 

回答

2

Rubocop抱怨@@class_variable風格。類變量的使用能夠被重構到使用一個類的實例變量:的

class SomeClass 
    @some_variable ||= [] 
end 

代替

class SomeClass 
    @@some_variable ||= [] 
end 

您可以在任何地方定義一個類的實例變量,其中self等於類對象。例如,在班級方法中:

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

好的答案。考慮用一個簡短的解釋來解釋爲什麼Robocop建議使用類實例變量而不是類變量,可能有一個更全面的解釋鏈接(比如Brent的回答[here](https:// stackoverflow)。 com/questions/15773552/ruby​​-class-instance-variable-vs-class-variable)或[this blog](http://thoughts.codegram.com/understanding-class-instance-variables-in-ruby/)) 。 –