2012-06-03 11 views
6

Ich habe diesen Code-Block auf Wikipedia als ein Beispiel für eine Quine (Programm, das sich selbst ausdruckt) in Ruby gefunden.Verständnis ruby ​​quine

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

Allerdings verstehe ich nicht, wie es funktioniert. Vor allem, was ich nicht bekommen, ist, dass, wenn ich die letzte Zeile zu entfernen, ich diesen Fehler:

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

Was in diesen Zeilen geschieht?

Antwort

6

Die <<something Syntax beginnt eine hier-Dokument, von UNIX entlehnt Shells per Perl - es ist im Grunde ein mehrzeiliges Zeichenfolgenliteral, das auf der Zeile nach dem << beginnt und endet, wenn eine Zeile mit something beginnt.

So strukturell wird das Programm dies nur tun:

puts str*2,2 

... das heißt, drucken Sie zwei Kopien von str gefolgt von der Nummer 2.

Doch statt der Variablen str, es ist eine Zeichenkette über ein hier-Dokument, deren Endung Sentinel einschließlich ist auch die Ziffer 2:

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

es zwei Kopien des Zeichenfolge So druckt puts <<2*2,2, gefolgt von einer 2. (Und da die Methode zum Ausdrucken sie ist puts, jedes dieser Dinge bekommt eine neue Zeile automatisch angehängt.)

+0

Aber wenn die Endmarke der Zeichenfolge ist das "etwas" nach '< <', sollte es nicht '2 * 2,2' Sequenz sein, und die gleiche Sequenz in der letzten Zeile, um es zu beenden? – SasQ

+0

Der Vorrang von '<<' ist enger als '*', so dass '<< 2 * 2'" die Zeichenfolge ist, die durch das folgende 2-terminierte Dokument repräsentiert wird, multipliziert mit 2 "statt" der durch folgende Zeichenfolge 2 * 2-terminiertes hier Dokument. " –

1

in Ruby können Sie Strings definieren mit

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

Ich nehme an, dass von hier, du den Rest erraten :)