Ruby에서 <<는 무엇을 의미합니까?


81

코드가 있습니다.

  def make_all_thumbs(source)
    sizes = ['1000','1100','1200','800','600']
    threads = []
    sizes.each do |s|
      threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }
    end
  end

무슨 <<뜻이야?

답변:


143

일반적인 방법으로 '<<'

대부분의 경우 '<<'는 나머지와 같이 정의 된 메서드이며, 귀하의 경우에는 "이 배열의 끝에 추가"를 의미합니다 ( 여기 참조 ).

그것은 당신의 특별한 경우이지만, "<<"메소드를 만나게 될 다른 많은 경우들도 있습니다. 나는 그것을 '연산자'라고 부르지 않을 것이다. 이것은 실제로 당신이 재정의하거나 당신의 개체를 위해 구현 될 수있는 어떤 개체에 정의 된 메서드이기 때문이다. '<<'의 다른 경우

  • 문자열 연결 : "a"<< "b"
  • IO에 출력 쓰기 : io << "텍스트 줄 \ n"
  • 메시지 다이제스트, HMAC 또는 암호에 데이터 쓰기 : sha << "Text to be hashed"
  • OpenSSL :: BN의 왼쪽 이동 : bn << 2
  • ...

싱글 톤 클래스 정의

그런 다음 프로그램 흐름 내에서 현재 범위의 신비한 변화 (= 자기의 변화)가 있습니다.

class A
  class << self
    puts self # self is the singleton class of A
  end
end

a = A.new
class << a
  puts self # now it's the singleton class of object a
end

그 수수께끼 class << self로 인해 내부에 대해 궁금해하고 조사했습니다. 내가 언급 한 모든 예제에서 <<실제로는 클래스에 정의 된 메서드입니다.

obj << stuff

다음과 같다

obj.<<(stuff)

class << self구조 (자기 대신에 또는 객체) 정말 다르다. 그것은 실제로 언어 자체의 내장 기능입니다. CRuby에서는 parse.y 에서 다음 과 같이 정의 됩니다.

k_class tLSHFT expr

여기서 tLSHFT는 '<<'토큰이고, k_class는 'class'키워드이며 expr은 임의의 표현식입니다. 즉, 실제로 쓸 수 있습니다.

class << <any expression>

식 결과의 싱글 톤 클래스로 '시프트'됩니다. tLSHFT 시퀀스는 'NODE_SCLASS'표현식으로 구문 분석되며 이는 싱글 톤 클래스 정의 라고합니다 (참조 : node.c).

case NODE_SCLASS:
    ANN("singleton class definition");
    ANN("format: class << [nd_recv]; [nd_body]; end");
    ANN("example: class << obj; ..; end");
    F_NODE(nd_recv, "receiver");
    LAST_NODE;
    F_NODE(nd_body, "singleton class definition");
    break; 

여기 문서

그리고 어떻게 잊을 수 있겠습니까? Here Documents 는 '<<'를 완전히 다른 방식으로 사용합니다. 다음을 선언하여 편리하게 여러 줄에 걸쳐있는 문자열을 정의 할 수 있습니다.

here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_

'here doc 연산자'를 구별하려면 임의의 문자열 구분 기호가 '<<'바로 뒤에 와야합니다. 해당 초기 구분 기호와 동일한 구분 기호의 두 번째 발생 사이의 모든 항목이 최종 문자열의 일부가됩니다. '<<-'를 사용할 수도 있습니다. 차이점은 후자를 사용하면 선행 또는 후행 공백을 무시한다는 것입니다.


4
매우 철저한 답변입니다. 초보자에게는 혼란 스러울 수 있지만 현명한 사람 (아마도)이 말했듯이 "넓은 질문을하고 철저한 답변을 얻으십시오".
Kelvin

1
안녕하세요 @emboss 감사합니다 : 그래서 <<는 배열에서 push 메서드를 호출하는 것과 동일합니까?
BKSpurgeon 2016

30

배열 끝에 값을 추가하기 위해 배열에서 주로 사용됩니다.

a = ["orange"]
a << "apple"
puts a

이것을 준다

  [ "주황색", "사과"] 
결과.


3
클래스 상속<< 에서 한 가지 더 사용
Zabba

7

새 항목 을 추가하여 기존 배열 을 공급할 수있는 연산자입니다 .

위의 예에서는 threads5 개의 새 스레드로 빈 배열 을 채 웁니다.



6

루비에서는 항상 한 가지 방법이 있습니다. 따라서 Ruby에는 일반적인 메서드 이름에 대한 몇 가지 멋진 단축키가 있습니다. 이와 같이 .push 메서드 이름을 입력하는 대신 .push 용으로 연결 연산자 인 <<를 사용하면됩니다. 실제로 어떤 경우에는 동일한 작업에 이들 중 하나를 사용할 수 있습니다. .push 및 + with <<.

이 예에서 볼 수있는 것처럼 :

alphabet = ["a", "b", "c"]
alphabet << "d" # Update me!
alphabet.push("e") # Update me!
print alphabet 
caption = "the boy is surrounded by "
caption << "weezards!" # Me, too!
caption += " and more. " # Me, too!
# .push can no be uses for concatenate 
print caption

결과는 다음과 같습니다.

["a", "b", "c", "d", "e"]
the boy is surrounded by weezards! and more.

연산자 <<를 사용하여 요소를 배열로 푸시하거나 문자열을 다른 문자열에 연결할 수 있습니다.

그래서 이것이하는 일은 새로운 요소 / 객체 Thread 유형을 만들고 배열로 밀어 넣는 것입니다.

 threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }

5

루비에서 '<<'연산자는 기본적으로 다음 용도로 사용됩니다.

  1. 배열에 값 추가 (마지막 위치)

    [2, 4, 6] << 8 [2, 4, 6, 8]

  2. 루비의 일부 활성 레코드 작업에도 사용되었습니다. 예를 들어 Cart has_many line_items로 연결된 Cart 및 LineItem 모델이 있습니다. Cart.find (A) .line_items는 카트 'A'에 속하는 광고 항목과 함께 ActiveRecord :: Associations 개체를 반환합니다.

이제 다른 line_item (X)을 장바구니 (A)에 추가 (또는 연결)하려면

Cart.find(A).line_items << LineItem.find(X)
  1. 이제 동일한 카트 'A'에 다른 LineItem을 추가하지만 이번에는 line_item 객체를 생성하지 않을 것입니다 (즉, activerecord 객체를 수동으로 생성하지 않을 것입니다).

    Cart.find (A) .line_items << LineItem.new

위의 코드에서 <<는 개체를 저장하고 왼쪽 활성 레코드 연결 배열에 추가합니다.

그리고 위의 답변에서 이미 다룬 많은 다른 사람들.


모두가 <<의이 동작을 아는 것은 아닙니다. 언급 해 주셔서 감사합니다.
Ammar Shah

0

끝에 추가 (추가)를 의미합니다.

a = [1,2,3]
a << 4
a = [1,2,3,4]

0

또한, 2.6 루비 때문에, <<방법에서도 정의된다 Proc.

Proc # <<를 사용하면 두 개 이상의 procs를 구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.