2013-06-18 9 views
9

Ich verstehe nicht, warum eval funktioniert wie folgt:Rubin: eval mit String-Interpolation

"123 #{456.to_s} 789" # => "123 456 789" 
eval('123 #{456.to_s} 789') # => 123 

Wie kann ich in einen String innerhalb eval interpolieren?

Update:

Danke, Freunde. Es funktionierte.

Wenn Sie also eine String-Variable mit #{} haben, die Sie später eval wollen, sollten Sie es tun, wie weiter unten erläutert:

string = '123 #{456} 789' 
eval("\"" + string + "\"") 
# => 123 456 789 

oder

string = '123 #{456} 789' 
eval('"' + string + '"') 
# => 123 456 789 
+1

Was meinen Sie mit "Makro Substitutionen"? – sawa

+0

@sawa, ich meinte '# {}' Abschnitte, bitte, bearbeiten Sie es richtig, ich weiß nur nicht, wie man es auf Englisch sagt –

+1

Okay, vielleicht meintest du Interpolation. – sawa

Antwort

19

Was passiert ist, evaluiert eval die Zeichenfolge als Quellcode. Wenn Sie doppelte Anführungszeichen verwenden, wird der String interpoliert

eval '"123 #{456.to_s} 789"' 
# => "123 456 789" 

Allerdings, wenn Sie einfache Anführungszeichen verwenden, gibt es keine Interpolation ist, daher der # einen Kommentar beginnt, und Sie erhalten

123 #{456.to_s} 789 
# => 123 

Der String Interpolation geschieht vor dem eval Aufruf, weil es der Parameter für die Methode ist.

Beachten Sie auch die 456.to_s ist unnötig, Sie können einfach #{456} tun.

+1

Das Ersetzen der einfachen Anführungszeichen durch doppelte Anführungszeichen ergibt einen Syntaxfehler, weil 'eval (" 123 # {456.to_s} 789 ")' '123 456 789' ' – Stefan

+0

ist, was ist, wenn die Zeichenfolge # {} hat und so heißt: string = '12 # {45} 78 "9" 0 ' –

3

Sie wollten:

eval('"123 #{456.to_s} 789"') 

. . . Hoffentlich kannst du sehen warum?

Der Code zum interpretter von eval übergeben wird, genau so, wie wenn Sie es geschrieben hatte (in irb oder als Teil einer .rb-Datei), so dass, wenn Sie ein eval zur Ausgabe eines String-Wert wollen, wird die Zeichenfolge Sie müssen bewerten Fügen Sie die Anführungszeichen ein, die den Ausdruck darin enthalten String.