为什么<<方法显式返回自助方法链接?

时间:2016-10-10 09:31:56

标签: ruby

我正在阅读Ruby编程表达式。

class ScoreKeeper
  def initialize
    @total_score = @count = 0
  end
  def <<(score)
    @total_score += score
    @count += 1
    self
  end
  def average
    fail "No scores" if @count.zero?
    Float(@total_score) / @count
  end
end

scores = ScoreKeeper.new
scores << 10 << 20 << 40
puts "Average = #{scores.average}"

这会产生

Average = 23.333333333333332

这本书的出现

  

请注意,此代码中存在细微之处 - &lt;&lt;方法明确   回归自我。它这样做是为了允许该方法链接在一起   分数&lt;&lt; 10&lt;&lt; 20&lt;&lt; 40.因为每次调用&lt;&lt;返回分数   对象,然后你可以调用&lt;&lt;再次,传递新的分数。

我仍然不明白为什么回归自我允许方法链接 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

如果您在self之后没有返回@count += 1,则在撰写scores << 2 << 1后,您最终会收到错误消息

undefined method << for Fixnum

scores = ScoreKeeper.new
scores << 10 << 20

有效,因为scores << 10返回接收者,即在其上定义了方法<<的对象,例如scores。因此可以链接方法调用。

如果没有self,您将无法链接方法调用,因为<<方法的返回值将是一个数字。

修改

根据JörgWMittag的评论(假设您使用的是Ruby 2.4.x):

  

实际上,情况更糟:<< is defined for Integers,所以你不会   得到一个错误,而不是一个非明显错误的结果。 (或者更多   确切地说,当你试图打电话时,你会得到一个错误   不存在的Integer#average方法。)