Warum funktioniert die String-Interpolation in Ruby, wenn keine geschweiften Klammern vorhanden sind?


88

Die richtige Methode zur Verwendung der Zeichenfolgeninterpolation in Ruby lautet wie folgt:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

So will ich es immer benutzen.

Ich habe jedoch etwas Seltsames in Rubys String-Interpolation bemerkt . Ich habe festgestellt, dass die String-Interpolation in Ruby ohne die geschweiften Klammern in Bezug auf Instanzvariablen funktioniert. Beispielsweise:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

Und dass es nicht funktioniert, dasselbe wie eine Nicht-Instanz-Variable zu versuchen.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

Ich habe dies sowohl in 1.9.2 als auch in 1.8.7 mit Erfolg versucht.

Warum funktioniert das? Was macht der Dolmetscher hier?

Antworten:


102

Laut der Ruby-Programmiersprache von Flanagan und Matsumoto:

Wenn der in das Zeichenfolgenliteral zu interpolierende Ausdruck lediglich eine Referenz auf eine globale, Instanz- oder Klassenvariable ist, können die geschweiften Klammern weggelassen werden.

Also sollte alles funktionieren:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"

4
Coole Frage übrigens. Es ist schön, zurück zu gehen und die kleinen Ecken der Sprache zu finden, die ich vergessen hatte.
Tsherif

2
Obwohl Ihre Antwort keinen Grund enthält, warum oder was gerade passiert, finde ich, dass der Grund schwer zu fassen ist. Selbst die alten Message Boards, die Matz häufig kommentierte, helfen nicht weiter. Ihre Antwort zeigt jedoch, dass es sich um eine Funktion handelt, die nicht nur ein Zufall ist.
Charles Caldwell

1
Ich bin mir nicht sicher, was Sie als Grund erwarten. Meinst du als Designentscheidung? Meine Vermutung wäre, dass es ein Versuch einer Perl-ähnlichen Syntax war, da ich glaube, dass Ruby ursprünglich als eine Art Perl ++ konzipiert wurde, bevor es zu seiner eigenen wurde.
Tsherif

2
Ich bin ein absoluter Neuling und habe mich gerade von meiner IDE darüber beschweren lassen. Aber es fällt mir schwer, mich davon zu überzeugen, dass es ein guter Stil ist. Es ist sinnlos inkonsistent und hat einen Nachteil - z. B. wenn ich eine Instanzvariable @distance mit dem Wert 100 habe und eine Zeichenfolge erstellen möchte, die mit einem Ausdruck wie "# @ distancem" so etwas wie "100m" sagt, erhalte ich nur eine leere Zeichenfolge weil es keine Instanzvariable 'distancem' gibt. Das klingt also nach einem absolut schlechten Stil.
Terriblememory

3
@terriblememory Oh, es ist definitiv ein schlechter Stil. Deshalb habe ich meine Frage damit begonnen, auf die richtige Vorgehensweise hinzuweisen. Ich fand es jedoch nur seltsam, dass es überhaupt ein Merkmal der Sprache war, und fragte mich, warum es funktionierte. Andererseits ist es auch ein schlechter Stil, einen Satz mit einer Konjunktion zu beginnen. Aber Sie werden immer noch Leute sehen, die es hier und da benutzen. =)
Charles Caldwell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.