关于Ruby的澄清<<操作者

时间:2012-03-16 00:40:45

标签: ruby oop

我是Ruby的新手,我想知道<<运算符。当我用Google搜索这个运算符时,它说这是一个二进制左移运算符给出了这个例子:

  

a << 2会提供15

1111 0000

但是,在此代码中它似乎不是“二进制左移运算符”:

class TextCompressor
  attr_reader :unique, :index

  def initialize(text)
    @unique = []
    @index = []

    add_text(text)
  end

  def add_text(text)
    words = text.split
    words.each { |word| do add_word(word) }
  end

  def add_word(word)
    i = unique_index_of(word) || add_unique_word(word)
    @index << i
  end

  def unique_index_of(word)
    @unique.index(word)
  end

  def add_unique_word
    @unique << word
    unique.size - 1
  end
end

this question似乎不适用于我给出的代码。因此,使用我的代码,Ruby <<运算符如何工作?

5 个答案:

答案 0 :(得分:29)

Ruby是一种面向对象的语言。面向对象的基本原则是对象将消息发送到其他对象,并且消息的接收者可以以其认为合适的任何方式响应消息。所以,

a << b

意味着a决定它应该意味着什么。如果不知道<<是什么,就无法说出a的含义。

作为一般惯例,Ruby中的<<表示“追加”,即它将其参数附加到其接收器,然后返回接收器。因此,对于Array,它将参数附加到数组,对于String,它执行字符串连接,对于Set,它将参数添加到集合中,对于IO它写入文件描述符,等等。

作为特殊情况,对于FixnumBignum,它会执行Integer的二进制补码表示的按位左移。这主要是因为它在C中的作用,而Ruby受C的影响。

答案 1 :(得分:9)

&LT;&LT;只是一种方法。它在某种意义上通常意味着“附加”,但可以表示任何意义。对于字符串和数组,它意味着追加/添加。对于整数,它是按位移位。

试试这个:

class Foo
  def << (message)
    print "hello " + message
  end
end

f = Foo.new
f << "john" # => hello john

答案 2 :(得分:4)

在Ruby中,运算符只是方法。根据变量的类,<<可以执行不同的操作:

# For integers it means bitwise left shift:
5 << 1  # gives 10
17 << 3 # gives 136

# arrays and strings, it means append:
"hello, " << "world"   # gives "hello, world"
[1, 2, 3] << 4         # gives [1, 2, 3, 4]

这完全取决于班级定义<<的内容。

答案 3 :(得分:2)

<<是一个运算符,它是用于在给定对象上调用<<方法的语法糖。在Fixnum it is defined to bitshift left上,但它具有不同的含义,具体取决于它所定义的类。例如,对于Array it adds (or, rather, "shovels") the object into the array

我们在这里可以看到<<确实只是方法调用的语法糖:

[] << 1   # => [1]
[].<<(1)  # => [1]

因此,在您的情况下,只需在<<上调用@unique,在这种情况下为Array

答案 4 :(得分:1)

&lt;&lt;根据{{​​3}},函数是一个追加函数。它将传入的值附加到数组,然后返回数组本身。 Ruby对象通常可以在其上定义函数,在其他语言中,它们看起来像运算符。