【问题标题】:Assign result of a method to instance variable将方法的结果分配给实例变量
【发布时间】:2015-11-05 01:35:00
【问题描述】:

我经常将方法的结果赋值给初始化器中的实例变量:

class MyExample
  def initialize
    @my_var = test_method
  end

  def test_method
    # does something
  end
end 

initialize 中而不是在方法中执行此操作似乎是记忆化的一种特殊情况。我这样做是为了避免显式调用该方法,这使我的代码更具可读性。我还想确保该方法只为实例调用一次。

我没有找到类似这样的代码。

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

【问题讨论】:

  • 在“代替方法”中,“方法”指向哪个方法?目前尚不清楚“显式调用方法”是什么意思。
  • 我没有明确地调用 MyExample.new.test_method。而是我只写了MyExample.new,并且实例变量中test_method的返回值可以用在其他方法中(或者被attr_reader访问,上例中没有包含)。

标签: ruby methods instance-variables memoization


【解决方案1】:

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

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

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

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

class MyExample
  def initialize
    test_method
  end

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2018-10-24
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多