2012-06-03 16 views
6

Ho trovato questo blocco di codice su Wikipedia come un esempio di un quine (programma che si stampa da solo) in Ruby.Capire il rubino quine

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

Tuttavia, non capisco come funziona. In particolare, quello che non capisco è che quando tolgo l'ultima riga, ottengo questo errore:

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

Cosa succede in quelle righe?

risposta

6

La sintassi <<something inizia una qui-documento, preso in prestito da UNIX shell tramite Perl - è fondamentalmente una stringa letterale multilinea che inizia sulla linea dopo lo << e termina quando una riga inizia con something.

Così strutturalmente, il programma è solo facendo questo:

puts str*2,2 

... cioè, stampa due copie di str seguito dal numero 2.

Ma invece della variabile str, è tra cui una stringa letterale tramite un qui-documento il cui fine sentinella è anche la cifra 2:

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

Quindi esso stampa due copie della stringa puts <<2*2,2, seguito da un 2. (E poiché il metodo utilizzato per stamparli è puts, a ciascuno di questi elementi viene aggiunta automaticamente una nuova riga.)

+0

Ma se il marcatore finale della stringa è il "qualcosa" dopo "< <', allora non dovrebbe essere la sequenza' 2 * 2,2' allora, e la stessa sequenza usata nell'ultima riga per terminarla? – SasQ

+0

La precedenza di '<<' è più stretta di '*', quindi '<< 2 * 2' è" la stringa rappresentata dal seguente documento qui terminato 2, moltiplicato per 2 "piuttosto che" la stringa rappresentata dal seguente Documento qui 2 * 2-terminato. " –

1

In ruby, è possibile definire le stringhe con

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

Suppongo che da qui, si può intuire il resto :)