코드가 있습니다.
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
무슨 <<
뜻이야?
답변
일반적인 방법으로 ‘<<‘
대부분의 경우 ‘<<‘는 나머지와 같이 정의 된 메서드이며, 귀하의 경우에는 “이 배열의 끝에 추가”를 의미합니다 ( 여기 참조 ).
그것은 당신의 특별한 경우이지만, “<<“메소드를 만나게 될 다른 많은 경우들도 있습니다. 나는 그것을 ‘연산자’라고 부르지 않을 것이다. 이것은 실제로 당신이 재정의하거나 당신의 개체를 위해 구현 될 수있는 어떤 개체에 정의 된 메서드이기 때문이다. ‘<<‘의 다른 경우
- 문자열 연결 : “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 연산자’를 구별하려면 임의의 문자열 구분 기호가 ‘<<‘바로 뒤에 와야합니다. 해당 초기 구분 기호와 동일한 구분 기호의 두 번째 발생 사이의 모든 항목이 최종 문자열의 일부가됩니다. ‘<<-‘를 사용할 수도 있습니다. 차이점은 후자를 사용하면 선행 또는 후행 공백을 무시한다는 것입니다.
답변
배열 끝에 값을 추가하기 위해 배열에서 주로 사용됩니다.
a = ["orange"]
a << "apple"
puts a
이것을 준다
[ "주황색", "사과"]
결과.
답변
새 항목 을 추가하여 기존 배열 을 공급할 수있는 연산자입니다 .
위의 예에서는 threads
5 개의 새 스레드로 빈 배열 을 채 웁니다.
답변
‘a << b’는 a 끝에 b를 추가하는 것을 의미합니다.
답변
루비에서는 항상 한 가지 방법이 있습니다. 따라서 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)
}
답변
루비에서 ‘<<‘연산자는 기본적으로 다음 용도로 사용됩니다.
-
배열에 값 추가 (마지막 위치)
[2, 4, 6] << 8 [2, 4, 6, 8]
-
루비의 일부 활성 레코드 작업에도 사용되었습니다. 예를 들어 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)
-
이제 동일한 카트 ‘A’에 다른 LineItem을 추가하지만 이번에는 line_item 객체를 생성하지 않을 것입니다 (즉, activerecord 객체를 수동으로 생성하지 않을 것입니다).
Cart.find (A) .line_items << LineItem.new
위의 코드에서 <<는 개체를 저장하고 왼쪽 활성 레코드 연결 배열에 추가합니다.
그리고 위의 답변에서 이미 다룬 많은 다른 사람들.
답변
끝에 추가 (추가)를 의미합니다.
a = [1,2,3]
a << 4
a = [1,2,3,4]