2012-03-16 17 views
3

Rubyにはかなり新しく、<<演算子が不思議です。Rubyの解説<<演算子

a << 2しかし1111 0000

ある15を与えるだろう、「バイナリではないようです。私はこの演算子をGoogleで検索すると、それがこの例で与えられた2進数の左シフト演算子であることを言いますこのコードでの左シフト演算子」:

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 <<はどのように動作しますか?

+2

"a"とは異なることがあります。 '1 << 4 # => 16 'となります。 (この場合、 "a"は 'Fixnum'でした。演算子は単なるメソッドなので、上記の' '.__ send __(:<<、16)'と書くことができます。少なくとも '' ''は最初の引数で*多形*です) –

+4

あなたはそれをグーグルではできませんが、あなたはそれを記号で表すことができます:http://symbolhound.com/?q=array+%3C%3C –

+1

@AndrewGrimm you私はコーヒーの私の杯をこぼさせた。私は長い間このようなツールを探してきました。 – user2398029

答えて

18

Rubyはオブジェクト指向言語です。オブジェクト指向の基本原理は、オブジェクトが他のオブジェクトにメッセージを送信することであり、メッセージの受信者は、どのような方法でメッセージにも応答することができます。したがって、

a << b 

は、それが意味するものを意味するものを意味します。どのような<<が何を知らずに何を意味するのかはわかりません。aです。

一般的な慣例として、Rubyの<<は「追加」を意味します。つまり、引数を受信者に追加してから受信者を返します。したがって、Arrayの場合は、配列に引数を追加します。Stringの場合は文字列連結を実行し、Setの場合は、引数にファイルを追加します。IOの場合はファイル記述子に書き込まれます。

特殊ケースとして、FixnumBignumの場合、Integerの2の補数表現のビット左シフトを実行します。これは主にC言語で行われていることであり、RubyはC言語の影響を受けているからです。

6

< <は単なる方法です。それは通常、ある意味では「追加」を意味しますが、何かを意味する可能性があります。文字列と配列の場合は、追加/追加を意味します。整数の場合、ビット単位でシフトします。

これを試してみてください:

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

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

<<は、指定されたオブジェクトで<<メソッドを呼び出すための構文糖である演算子です。 Fixnum it is defined to bitshift leftにありますが、定義されているクラスによって意味が異なります。たとえば、Array it adds (or, rather, "shovels") the object into the arrayです。

我々は<<が実際にメソッド呼び出しのためだけ糖衣構文であることをここで見ることができます。

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

ので、あなたの場合には、それだけで、この場合にArrayある、@unique<<を呼び出します。

2

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] 

これは、すべてのクラスがあることを<<を定義するかに依存します。

関連する問題