在这个代码中,我有子类(Bar
,Baz
)继承父类(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
答案 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
一次。