动态惰性实例变量记忆

Ily*_*lya -1 ruby metaprogramming

在 Ruby 中,我们有两种方法来获取/设置实例变量 -instance_variable_getinstance_variable_set. 此外,在某些情况下,记住实例变量是一种很好的做法:

@foo ||= 'bar'
Run Code Online (Sandbox Code Playgroud)

因此,我尝试将这 2 个功能结合起来,因为我需要动态实例变量名称:

iv = :@foo
instance_variable_set(iv, 'bar') unless instance_variable_get(iv)
Run Code Online (Sandbox Code Playgroud)

我不确定,但是有没有更优雅的方式来写这个?

Ser*_*sev 5

延迟评估实例变量

这不是“懒惰评价”,这是“记忆化”。

有没有更优雅的方式来写这个?

这读起来更像原始表达式(实际上相当于它的行为):

instance_variable_get(:@foo) || instance_variable_set(:@foo, 'bar')
Run Code Online (Sandbox Code Playgroud)