我一直在读一本关于Ruby的书,我不明白这个方法的作用,具体来说,<<
在定义为像def <<(score)
这样的方法时会做什么?< / p>
class ScoreKeeper
def initialize
@total_score = 0
@count = 0
end
def <<(score)
@total_score += score
@count += 1
self
end
def average
fail "No scores" if @count == 0
Float(@total_score) / @count
end
end
scores = ScoreKeeper.new
scores << 10 << 20 << 40
puts "Average = #{scores.average}"
答案 0 :(得分:4)
它的方法定义。从现在开始,你可以这样做:
score_keeper = ScoreKeeper.new
score_keeper.<<(score)
或简写(类似运算符的方法的语法糖):
score_keeper << score
答案 1 :(得分:2)
<<
仅在某些对象类上调用时附加一些内容:已将其定义为方法的内容,以及该方法包含将内容附加到一起的代码的位置。
Ruby的创建者决定它应该适用于某些对象类型而不是其他对象类型。例如,对于一个字符串,它将附加参数,但如果参数不是一个字符串,它将以一种可能无法预测的方式运行:
>> "foo" << "bar"
=> "foobar"
>> "foo" << "1"
=> "foo1"
>> "foo" << 1
=> "foo\001"
>> "foo" << 123
=> "foo{"
类似地,当调用整数时,它的行为实际上非常令人费解:
>> 1 << 2
=> 4
>> 2 << 1
=> 4
>> 3 << 3
=> 24
>> 5 << 2
=> 20
>> 1 << 3
=> 8
这仅仅是实施,即I.E.,编写代码的人的决定。使用整数,它正在做某些东西,但我需要去查看源代码以查看内容。
因此,<<
已经实现作为各类对象的方法。您可以覆盖其中的每一个以使其执行不同的操作,并且您可以添加自己的实现,以使其对当前没有该方法的对象执行某些操作。
答案 2 :(得分:0)
在此上下文(追加或聚合数据)中,Operator <<
是来自C ++ iostream的遗留物。它通常用于将数据序列化为流。这部分在这里:
def <<(score)
@total_score += score
@count += 1
self # < this!
end
表示当operator&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;应用,允许您chain
另一个操作,而无需键入任何括号或方法名称。这只是语法糖。
可能它被错误地用作聚合运算符而不是序列化或附加到容器,这就是它混淆的原因。
答案 3 :(得分:0)
<<
通常被称为插入运算符,因为它用于将信息插入到数组,文件,集合等中。
编写代码的人选择使用它而不是方法,因为这个类的行为有点像得分。
它以与加法运算符+
类似的方式存在,但因为你在数学中看不到它看起来很奇怪。如果ScoreKeeper
课程只是@total_score
(而不是@count
),那么您可以定义+(score)
。
答案 4 :(得分:0)
你可以称之为推送,因为红宝石使用&#34; Push&#34;和#34; Pop&#34;有数组和...任何对象,真的。 所以,如果我有一段这样的代码:
a = [1, 2, 3, 4]
a将是一个包含1,2,3,4的固定数字数组,如果我使用以下内容:
a << 5
5将是&#34; Pushed&#34;进入数组,所以数组现在是[1, 2, 3, 4, 5]
。