了解实例变量和局部变量的用例

时间:2016-02-22 12:01:08

标签: ruby instance-variables

假设我有一个用户类,如下所示

class User
  def initialize
    test
  end

  def test
    name = ['name1','name2', 'name3']
    returned_value = test1(name)
    lots of if else condition based on returned_value 
  end

  def test1(name)
    test2(name)
  end

  def test2(name)
    test3(name)
  end

  def test3(name)

  end
end

这个用户类有一些方法,比如test,test1 ..每个方法都做一些单个数组的计算,然后返回数组。现在基于返回值测试方法添加或删除数组中的元素。由于返回的值可能是空白的,一个元素,二维数组等等,因此很多if else条件变得非常难看。

但是如果我使用实例变量,那么我就不必返回任何值,因此我根据返回的值不需要任何if else语句,我的代码看起来很干净。例如

class User
  def initialize
    @name = ['name1','name2', 'name3']
    test
  end

  def test

    test1
  end

  def test1
    test2
  end

  def test2
    test3
  end

  def test3

  end
end 

我的问题是,在这种情况下我应该使用实例变量吗?解释会很好。

更新 简而言之,我想在一个类的不同方法中操纵一个单独的数组。现在,我可以在test方法中创建数组,然后将其传递给其他方法(在上面的例子中的第一种情况)或者我可以在initialize方法中创建数组,然后我不必每次都传递数组(我上面例子中的第二个案例)。所以我的问题是

我的第一种/第二种方法是不好/好吗?或者两种方法都可以使用?

1 个答案:

答案 0 :(得分:1)

如果您的数据需要可以被类中的许多方法访问,那么实例变量是管理它的好方法。

我通常在PORO类中使用实例变量有两个原因

  1. 存储信息,通常在初始化时,很多 类方法需要访问。这就是你要问的问题 以上。
  2. 要记住资源密集型方法。
  3. 例如,为了避免每次访问customer_data时都进行api调用,我会替换

    def customer_data
      HTTParty.get... (some api call)
    end
    

    def customer_data
      @customer_data ||= HTTParty.get... (some api call)
    end
    

    @customer_data仅在该方法中使用,但如果我多次调用该方法,则只需要一次api调用。这假设(当然)对于给定的类对象,只有一个关联的客户。