我正在阅读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;再次,传递新的分数。
我仍然不明白为什么回归自我允许方法链接 有人可以帮忙吗?
答案 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 forInteger
s,所以你不会 得到一个错误,而不是一个非明显错误的结果。 (或者更多 确切地说,当你试图打电话时,你会得到一个错误 不存在的Integer#average
方法。)