将方法的结果分配给实例变量

时间:2015-08-12 12:29:26

标签: ruby methods instance-variables memoization

我经常将方法的结果分配给初始化程序中的实例变量:

class MyExample
  def initialize
    @my_var = test_method
  end

  def test_method
    # does something
  end
end 

initialize而不是方法中执行此操作似乎是一个特殊的memoization案例。我这样做是为了避免显式调用方法,这使我的代码更具可读性。我还想确保该方法仅针对实例调用一次。

我没有找到看起来像这样的代码。

  • 除了通常的记忆之外,在初始化程序中执行此操作是否有任何缺点?
  • 这会在某种程度上被视为不良做法吗?为什么?

1 个答案:

答案 0 :(得分:0)

如果只需要将方法的结果放入实例变量而不在类的实例上显式调用方法,那么您的方法是合理的。如果你的方法体不是太长,你甚至可以在初始化器中内联它。

如果您希望只调用一次方法,则可以执行以下操作:

def test_method
   return if @your_method_has_been_called.nil?
   @test_method_has_been_called = true
   #perform your operations
end

但是,如果您只关心操作只执行一次(可能是一项昂贵的操作),那么您可以在方法中使用|| = operator并在那里设置实例变量而不是在初始化程序内部。例如:

class MyExample
  def initialize
    test_method
  end

  def test_method
    @my_var ||=  1+1 # Replace your operation here
  end
end

在任何一种情况下,由于您不希望通过您的方法公开您的结果,因此最好将其作为私有方法。