2012-03-16 12 views
3

저는 Ruby를 처음 사용하여 << 연산자에 대해 궁금합니다.Ruby에 대한 설명 << 연산자

a << 2 그러나 1111 0000

입니다 15을 줄 것이다, "이진 될 것 같지 않습니다 :이 연산자를 봤 때, 그것은이 예제 주어진 이진 왼쪽 Shift 운영자는 말한다 이 코드에서 왼쪽 시프트 연산자 "

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 내가 준 코드에 적용하지 않는 것 같습니다. 그래서 내가 가지고있는 코드로 루비 <<은 어떻게 작동합니까?

+2

"a"가 무엇인지에 따라 다른 일을합니다. '1 << 4 # => 16 '이 예상됩니다. (이 경우 "a"는 'Fixnum'이었습니다. 연산자는 위의 예에서'1 .__ send __ (: << 16)'과 같이 쓰여질 수있는 메서드라는 것을 기억하십시오; 이것은 연산자를 의미합니다. 최소'<<'는 첫 번째 인수에서 * 다형성 *입니다. –

+4

당신은 그것을 할 수는 없지만 그것을 상징 할 수 있습니다 : http://symbolhound.com/?q=array+%3C%3C –

+1

@AndrewGrimm you 커피 한잔 쏟아 부었어. 나는 이와 같은 도구를 _so_ 오래 찾고 있었다. – user2398029

답변

18

루비는 객체 지향 언어입니다. 객체 지향의 기본 원칙은 객체가 다른 객체에 메시지를 보내고 메시지의 수신자가 어떤 방식 으로든 메시지에 응답 할 수 있다는 것입니다. 따라서

a << b 

은 무엇을 의미하는지 결정해야합니다. 어떤 a인지 모른 채 <<이 무엇을 의미하는지 말할 수 없습니다.

일반적으로 루비의 <<은 "append"를 의미합니다. 즉, 인수를 수신자에게 추가 한 다음 수신자를 반환합니다. 따라서 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

루비에서 연산자는 단지 메서드 일뿐입니다. 당신의 변수의 클래스에 따라 <<는 다른 일을 수행 할 수 있습니다

# 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] 

그것은 모든 클래스가 될 << 정의에 따라 달라집니다.