访问匿名函数中的全局类变量

时间:2015-07-13 11:47:11

标签: ruby global-variables anonymous-function instance-variables

我尝试使用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)

1 个答案:

答案 0 :(得分: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)

当您需要存储类级别值(非全局或实例级别)时,类级别实例变量提供了更好的方法