2012-06-03 8 views
6

Ruby에서 위키 백과에서이 코드 블록을 발견했습니다 (자체적으로 인쇄하는 프로그램).ruby ​​quine 이해하기

puts <<2*2,2 
puts <<2*2,2 
2 

그러나 어떻게 작동하는지 알 수 없습니다. 특히 내가 얻지 못하는 것은 마지막 줄을 제거하면 다음과 같은 오류가 발생한다는 것입니다.

syntax error, unexpected $end, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END

이 줄에는 어떤 현상이 발생합니까?

답변

6

<<something 구문은 UNIX에서 빌린 여기-문서을 시작을 추측 할 수 있다고 가정

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

로 문자열을 정의 할 수 있습니다 쉘을 통해 Perl - 기본적으로 복 수행 문자열 리터럴은 << 다음에 시작하여 라인이 something으로 시작될 때 끝납니다. 그래서 구조적으로

, 프로그램은이 일을한다 :

puts str*2,2 

을 ... 즉, 인쇄 2.

하지만 그 대신 변수 str의 수에 따라 str의 두 복사본, 그것의

puts <<2*2,2 
puts <<2*2,2 
2 

가 그래서 문자열의 두 복사본을 출력 : 종료 감시 여기-문서를 통해 리터럴 문자열을 포함하면 숫자 2 puts <<2*2,2 다음에 2가 붙습니다. (그리고 그것들을 출력하는 방법이 puts이기 때문에, 각각의 것들은 자동적으로 줄 바꿈이 붙습니다.)

+0

그러나 문자열의 끝 마커가' <','2 * 2,2' 순서가 아니어야하며, 마지막 줄에서 끝까지 동일한 순서를 사용해야합니까? – SasQ

+0

'<<'의 우선 순위는'*'보다 가깝기 때문에'<< 2 * 2'는 "다음에 나오는 두 개의 종료 된 here 문서에 의해 표현 된 문자열에 다음과 같이 표현 된 문자열이 아니라 2를 곱한 것" 2 * 2로 종료 된 문서. " –

1

루비, 당신은 여기에서, 당신은 나머지 :