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

88

La bonne façon d'utiliser l'interpolation de chaîne 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 d' étrange dans l'interpolation de chaînes de Ruby. J'ai remarqué que l'interpolation de chaîne fonctionne dans 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?

Charles Caldwell
la source

Réponses:

102

Selon The Ruby Programming Language de Flanagan et Matsumoto:

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

Les éléments suivants devraient donc tous fonctionner:

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

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

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
tsherif
la source
4
Cool question, btw. C'est agréable de revenir en arrière et de retrouver les petits coins de la langue que j'avais oubliés.
tsherif
2
Bien que votre réponse ne contienne aucune raison pour laquelle ou ce qui se passe, je trouve que la raison est difficile à déterminer. Même les anciens babillards électroniques sur lesquels Matz commentait fréquemment n'aident pas. Cependant, votre réponse montre qu'il s'agit d'une fonctionnalité par opposition à un simple hasard.
Charles Caldwell
1
Je ne suis pas sûr de ce que vous attendez comme raison. Voulez-vous dire par décision de conception? Je suppose que c'était une tentative de syntaxe de type Perl , car je crois que Ruby a été conçu à l'origine comme une sorte de Perl ++ avant de devenir le sien.
tsherif
2
Je suis un noob complet et je viens de me plaindre de mon IDE. Mais j'ai du mal à me convaincre que c'est du bon style. C'est inutilement incohérent et a un inconvénient - par exemple, si j'ai une variable d'instance @distance avec la valeur 100 et que je veux créer une chaîne qui dit quelque chose comme "100m" en utilisant une expression comme "# @ distancem", j'obtiendrai juste une chaîne vide car il n'y a pas de variable d'instance 'distancem'. Cela ressemble donc à du mauvais style.
terriblememory
3
@terriblememory Oh, c'est vraiment du mauvais style. C'est pourquoi j'ai commencé ma question en indiquant la bonne façon de procéder. Cependant, j'ai juste trouvé étrange que ce soit une caractéristique de la langue et je me suis demandé pourquoi cela fonctionnait. Là encore, il est également mauvais de commencer une phrase par une conjonction. Mais vous verrez toujours des gens l'utiliser ici et là. =)
Charles Caldwell