我是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 <<
运算符如何工作?
答案 0 :(得分:29)
Ruby是一种面向对象的语言。面向对象的基本原则是对象将消息发送到其他对象,并且消息的接收者可以以其认为合适的任何方式响应消息。所以,
a << b
意味着a
决定它应该意味着什么。如果不知道<<
是什么,就无法说出a
的含义。
作为一般惯例,Ruby中的<<
表示“追加”,即它将其参数附加到其接收器,然后返回接收器。因此,对于Array
,它将参数附加到数组,对于String
,它执行字符串连接,对于Set
,它将参数添加到集合中,对于IO
它写入文件描述符,等等。
作为特殊情况,对于Fixnum
和Bignum
,它会执行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对象通常可以在其上定义函数,在其他语言中,它们看起来像运算符。