Por que a interpolação de strings funciona em Ruby quando não há chaves?

88

A maneira adequada de usar interpolação de string em Ruby é a seguinte:

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

É assim que pretendo sempre usar.

No entanto, notei algo estranho na interpolação de strings de Ruby. Percebi que a interpolação de strings funciona em Ruby sem as chaves em relação às variáveis ​​de instância. Por exemplo:

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

E tentar fazer o mesmo que uma variável que não seja de instância não funciona.

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

Eu tentei isso com sucesso em 1.9.2 e 1.8.7.

Por que isso funciona? O que o intérprete está fazendo aqui?

Charles Caldwell
fonte

Respostas:

102

De acordo com The Ruby Programming Language de Flanagan e Matsumoto:

Quando a expressão a ser interpolada no literal de string é simplesmente uma referência a uma variável global, de instância ou de classe, as chaves podem ser omitidas.

Portanto, o seguinte deve funcionar:

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

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

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
tsherif
fonte
4
Pergunta legal, aliás. É bom voltar e encontrar os cantinhos da linguagem que eu havia esquecido.
tsherif de
2
Embora sua resposta não contenha um motivo ou o que está acontecendo, estou descobrindo que o motivo é difícil de definir. Mesmo os antigos fóruns de discussão sobre os quais Matz comentava freqüentemente não estão ajudando. No entanto, sua resposta mostra que é um recurso e não apenas um acaso.
Charles Caldwell
1
Não tenho certeza do que você está esperando como motivo. Você quer dizer como uma decisão de design? Meu palpite é que foi uma tentativa de sintaxe parecida com o Perl , já que acredito que Ruby foi originalmente concebido como uma espécie de Perl ++ antes de se desenvolver.
tsherif de
2
Sou um noob completo e acabei de ouvir meu IDE reclamar de eu estar fazendo isso. Mas estou tendo um trabalho difícil para me convencer de que é um bom estilo. É inutilmente inconsistente e tem uma desvantagem - por exemplo, se eu tiver uma variável de instância @distance com valor 100 e quiser fazer uma string que diga algo como "100m" usando uma expressão como "# @ distancem", vou pegar uma string em branco porque não há variável de instância 'distancem'. Portanto, isso soa como um estilo totalmente ruim.
memória
3
@terriblememory Oh, definitivamente é um estilo ruim. É por isso que comecei minha pergunta apontando a maneira correta de fazer isso. No entanto, eu apenas achei estranho que fosse uma característica da linguagem e me perguntei por que funcionava. Então, novamente, também é um estilo ruim começar uma frase com uma conjunção. Mas você ainda verá pessoas usando aqui e ali. =)
Charles Caldwell