为什么在Ruby中返回“self”

时间:2013-04-25 03:58:53

标签: ruby

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

我的问题是:为什么有必要在“推”方法中返回“self”,但是我们不必返回self来说pop方法?这有什么区别?

谢谢!

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

这是由于用例不同。

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

换句话说,push是一种“setter / modifyer”方法,而pop是一种(破坏性的)“getter”方法。

答案 2 :(得分:2)

Ruby惯例是返回弹出时弹出的东西,以及推送时的数据结构。了解数组的行为方式。