在实例方法中分配对象变量

Mat*_*zke 1 ruby ruby-on-rails-4

我经常使用|| =运算符来减少冗余调用.我想采取这样的事情

@my_variable ||= my_calculation_method
Run Code Online (Sandbox Code Playgroud)

把它变成

@my_variable.assign { code_block }
Run Code Online (Sandbox Code Playgroud)

用这个想法

class Object
    def assign
      if self.instance_of? NilClass
          self = yield
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

正如您可能已经猜到的那样,分配self没有意义并且不起作用.

你如何访问方法中的@my_variable指针assign来修改值?

Ser*_*sev 5

如果你的初始化逻辑是非常重要的并跨越几行(我认为,这是问题的前提),这就是你能做的,在惯用的ruby中:

@my_variable ||= begin
  # code block
end
Run Code Online (Sandbox Code Playgroud)

我通常做的是将逻辑拆分为两部分.记忆与计算分开.你在第一行就有这个.

def stats
  @stats ||= compute_stats
end

def compute_stats
  ...
end
Run Code Online (Sandbox Code Playgroud)

我发现XXX + compute_XXX的这种模式很容易识别/跟随.