2

我在这里关注这个 Ruby 教程,它正在谈论堆栈和队列 http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/33-advanced-arrays/lessons/86-stacks-和队列#solution4117

它为堆栈提供了以下代码

class Stack
  def initialize
    @store = Array.new
  end

  def pop
   @store.pop
  end

  def push(element)
    @store.push(element)
    self
  end

  def size
    @store.size
  end
end

我的问题是:为什么必须在“push”方法中返回“self”,而在pop方法中我们不必返回self?这里有什么区别?

谢谢!

4

3 回答 3

7

Array#pushArray#pop返回不同的东西。第一个返回修改后的数组,第二个返回弹出的元素。

您可能不想返回修改后的数组的原因是它破坏了封装并暴露了对象的内部状态。尽管如此,我们还是想链接我们的推送调用(即Stack.new.push(2).push(5)),所以我们返回 self(类型Stack)而不是 nil 或其他东西。

于 2013-04-25T04:04:59.360 回答
3

这是由于用例的不同。

  • 当您使用 时push,您将它与参数一起使用element,并且您进一步知道操作成功。从方法中取回的值element是没有用的。具有返回值self使其更方便,例如允许链接方法。
  • 当您使用pop时,在有用的情况下,您不确定数组中是否有元素(否则它不成立),以及通过弹出来获得什么元素。而取回弹出的值是使用该方法的目的。

换句话说,push是“设置器/修改器”方法,pop而是(破坏性)“获取器”方法。

于 2013-04-25T05:22:22.763 回答
2

Ruby 约定是在弹出时返回被弹出的东西,并在推送时返回数据结构本身。查看数组的行为方式。

于 2013-04-25T04:01:55.053 回答