混淆实例变量而不是缺乏它

时间:2016-03-02 00:45:51

标签: ruby

来自“Grounded Rubyist'

的代码”
module Stacklike
  def stack
    @stack ||=[]
  end 

  def add_to_stack(obj)
    stack.push(obj)
  end

  def take_from_stack
    stack.pop
  end
end

而不是:

class Stack

 attr_reader :stack

 def initialize
  @stack = [] 
 end 

 def add_to_stack(obj)
  @stack.push(obj)
 end

 def take_from_stack
  @stack.pop
 end
end

我的主要困惑源于这样一个事实:在模块中,实例变量@stack不在add_to_stacktake_from_stack方法中。如何追踪stack的状态呢?

在课堂上,@stack用于所有常用的方法。

有人可以在模块中解释这是如何工作的吗?

1 个答案:

答案 0 :(得分:2)

  

在模块中,实例变量@stack不在add_to_stack和   take_from_stack方法。如何跟踪堆栈的状态   否则?

不完全。 add_to_stack推送@stack上的内容,因为stack方法返回@stack

  def stack
    @stack ||=[]
  end

  def add_to_stack(obj)
    stack.push(obj)
  end

所以最后,add_to_stack中使用了@stack

请注意,您可以安全地从@中的所有@stack中删除class Stack initialize中的分配除外),因为attr_reader :stack定义了stack {1}}返回@stack的方法。