0

Я пытаюсь использовать метод self.instance_exec. переменная экземпляра @legend в моем случае печатается очень красиво, но переменная класса выдает ошибку:Доступ к переменной глобального класса в анонимной функции

uninitialized class variable @@holiday_legend_counter in Object (NameError) 

Мой пример кода:

class Calender 
    def initialize(options) 
    @@holiday_legend_counter = "a" 
    @legend = 'A' 
    end 

    def print_date(print_date) 
    # some calculation to calculate date and the current date 
    self.instance_exec date, @current_start_date, &print_date 
    end 
end 


print_legend = Proc.new do |date,current_date| 
    print @@holiday_legend_counter 
    print @legend 
end 

cal = Calender.new 
cal.print_date(print_legend) 

ответ

0

Что вы можете может быть достигнуто путем слегка изменив код выше как показано ниже. Обратите внимание: если вы хотите использовать глобальную переменную уровня класса, лучше всего использовать ее как переменную экземпляра класса Singleton. Это имеет то преимущество, что вы случайно не переопределяете значение @@ holiday_legend_counter в подклассе, тем самым изменяя значение суперкласса для @@ holiday_legend_counter, потому что @@ holiday_legend_counter разделяется по иерархии классов.

class Calender 

    @holiday_legend_counter = "a" 
    class << self;attr_reader :holiday_legend_counter end 


    def initialize(options) 
    @legend = 'A' 
    end 

    def print_date(print_date) 
    #somecalculation to calculate date and the current date 
    self.instance_exec @current_start_date, &print_date 
    end 
end 

print_legend = Proc.new do |date, current_date| 
print Calender.holiday_legend_counter 
print @legend 
end 

cal = Calender.new("") 
cal.print_date(print_legend) 

уровня экземпляра класса переменных обеспечивают лучший подход, когда вам нужно для хранения значений уровня класса (не глобального или экземпляра уровня)

Смежные вопросы