我尝试使用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 :(得分: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)
当您需要存储类级别值(非全局或实例级别)时,类级别实例变量提供了更好的方法