web-dev-qa-db-fra.com

Pourquoi l'interpolation de chaînes fonctionne-t-elle en Ruby quand il n'y a pas d'accolades?

La bonne façon d'utiliser l'interpolation de chaînes dans Ruby est la suivante:

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

C'est ainsi que j'ai l'intention de toujours l'utiliser.

Cependant, j'ai remarqué quelque chose impair dans l'interpolation de chaînes de Ruby. J'ai remarqué que l'interpolation de chaînes fonctionne en Ruby sans les accolades en ce qui concerne les variables d'instance. Par exemple:

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

Et qu'essayer la même chose qu'une variable non-instance ne fonctionne pas.

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

J'ai essayé cela avec succès dans les versions 1.9.2 et 1.8.7.

Pourquoi ça marche? Que fait l'interprète ici?

84
Charles Caldwell

Selon The Ruby Programming Language par Flanagan et Matsumoto:

Lorsque l'expression à interpoler dans le littéral de chaîne est simplement une référence à une variable globale, d'instance ou de classe, les accolades peuvent être omises.

Donc, les éléments suivants devraient tous fonctionner:

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

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

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