实例变量与延迟加载方法

时间:2014-02-11 08:39:04

标签: ruby

我想知道直接引用实例变量和调用返回相同实例变量的方法之间的区别是什么。

让我们采取以下块:

def some_method
  return @var if @var.present?
  ...
end

功能方面,引用@var和调用some_method之间没有区别。两者都将返回相同的值(假设我们在同一个实例中)。

def another_method
  var = @var
end

将同样如下:

def yet_another_method
  var = some_method
end

这些方法如何相互不同?什么时候最后可能更好?

2 个答案:

答案 0 :(得分:1)

当您不想准确获取实例变量时,将实例变量包装在方法中,但稍微多一点。例如,如果要记忆,则不要调用

@foo

而是你需要把它放在一个方法中并调用它

def foo; @foo ||= ... end
foo ...

或者如果你想在变量取一定值时返回一个不同于变量的值,那么你需要在其中加入一个条件

def foo
  if @foo == ... then ... else @foo end
end
foo ...

答案 1 :(得分:0)

@bonus包含在方法中,您可以通过实现自己的方法来更改bonus的含义。这有助于您组织代码以便于更改,并使您能够依赖行为而不是数据。

class Pay
  attr_accessor :bonus

  def initialize(b)
    @bonus = b
  end

  def bonus
    @bonus = 100 if @bonus > 100    
  end
end