Ruby中的Cache类方法实例变量

时间:2017-05-09 04:17:43

标签: ruby

在这个代码中,我有子类(BarBaz)继承父类(Foo)的类方法,我如何确保@foo是只在所有孩子中创建一次?

class Foo
  def self.foo
    # only want @foo to be set once across any child classes 
    # that may call this inherited method.
    @foo ||= expensive_operation
  end
end

class Bar < Foo
  def self.bar
    self.foo + 'bar'
  end
end

class Baz < Foo
  def self.baz
    self.foo + 'baz'
  end
end

2 个答案:

答案 0 :(得分:4)

不要依赖于特定于类的实例变量,而是直接引用它:

class Baz < Foo
  def self.baz
    Foo.foo + 'baz'
  end
end

答案 1 :(得分:0)

这正是类实例变量的用途 - 语言机制让一个变量在从类继承的类之间共享。通常不建议使用它,因为它的行为与您想要的一样 - 这对来自其他语言的人来说很困惑。

class Foo
  def self.foo
    # notice @@
    @@foo ||= expensive_operation
  end

  def self.expensive_operation
    puts "Expensive operation"
    "cached value "
  end
end

class Bar < Foo
  def self.bar
    self.foo + 'bar'
  end
end

class Baz < Foo
  def self.baz
    self.foo + 'baz'
  end
end

Foo.foo
Bar.bar
Baz.baz

这只打印Expensive operation一次。