什么<<意味着作为方法名称,如def<<(得分)?

时间:2014-05-27 14:05:07

标签: ruby-on-rails ruby

我一直在读一本关于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}"

5 个答案:

答案 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]