0

有时我会看到类似的代码

class Thing
  def self.add_em(a,b)
    a+b
  end
end

有时我看到

class Thing
  def self.add_em(a,b)
    @a=a
    @b=b
    @a+@b
  end
end

何时/为什么应该使用@实例变量而不是仅使用传递的参数?

我相信一个原因是,如果您想在任何其他方法中使用这些变量,那么实例变量将可用,而基于参数的本地变量将不可用。然而,我经常看到 @ 变量被使用,即使这些变量没有在任何其他方法中使用。

所以我在方法开始时看到@a=a @b=b 的模式,所有传入的参数都被大量使用,但我不清楚为什么它们只是用于该方法。如果它们用于其他方法,这只是一种约定吗?

4

2 回答 2

2

正如您正确意识到的那样,除非在其他方法中使用它们,否则定义实例变量是没有意义的。如果使用了实例变量但没有在任何其他方法中调用,那么该代码可能不是由优秀的程序员编写的。

但请注意,有时方法定义乍一看并不明显。例如,如果有

class Thing
  attr_reader :a
end

那么实际上有一种方法使用@a.

于 2013-07-20T12:09:09.583 回答
1

我会说他们这样做是因为他们计划将参数引用为实例变量。如果不是,他们在 YAGNI 中失败了(原则上你不需要它)。如果他们在中途改变了主意(众所周知……),他们就会忘记整理。

于 2013-07-20T12:32:55.897 回答