2012-06-03 16 views
6

He encontrado este bloque de código en Wikipedia como un ejemplo de quine (programa que se imprime a sí mismo) en Ruby.Entendiendo ruby ​​quine

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

Sin embargo, no entiendo cómo funciona. Sobre todo, lo que no entiendo es que cuando se quita la última línea, me sale este error:

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

Lo que sucede en esas líneas?

Respuesta

6

La sintaxis <<something comienza un documento interno , tomado de UNIX shells a través de Perl - es básicamente un literal de cadena multilínea que comienza en la línea después del << y termina cuando una línea comienza con something.

Así estructuralmente, el programa sólo está haciendo esto:

puts str*2,2 

... es decir, imprimir dos copias de str seguido por el número 2.

Pero en lugar de la variable str, es incluyendo una cadena literal a través de un documento cuya terminando aquí centinela es también el dígito 2:

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

Así que imprime dos copias de la cadena puts <<2*2,2, seguido de un 2. (Y dado que el método utilizado para imprimirlos es puts, cada una de esas cosas tiene una nueva línea anexada automáticamente)

+0

Pero si el marcador final de la cadena es el "algo" después de '< <', ¿no debería ser entonces la secuencia' 2 * 2,2', y la misma secuencia utilizada en la última línea para finalizarla? – SasQ

+0

La precedencia de '<<' es más estricta que '*', por lo que '<< 2 * 2' es" la cadena representada por el siguiente documento de 2 terminados aquí, multiplicado por 2 "en lugar de" la cadena representada por el siguiente 2 * 2-terminó aquí el documento ". –

1

En Ruby, puede definir cadenas con

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

supongo que a partir de aquí, se puede adivinar el resto :)

Cuestiones relacionadas