Perché l'interpolazione delle stringhe funziona in Ruby quando non ci sono parentesi graffe?


90

Il modo corretto di utilizzare l'interpolazione di stringhe in Ruby è il seguente:

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

Questo è il modo in cui intendo usarlo sempre.

Tuttavia, ho notato qualcosa di strano nell'interpolazione delle stringhe di Ruby. Ho notato che l'interpolazione delle stringhe funziona in Ruby senza le parentesi graffe per quanto riguarda le variabili di istanza. Per esempio:

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

E che provare la stessa cosa come una variabile non di istanza non funziona.

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

L'ho provato con successo sia nella 1.9.2 che nella 1.8.7.

Perché funziona? Cosa ci fa l'interprete qui?

Risposte:


103

Secondo The Ruby Programming Language di Flanagan e Matsumoto:

Quando l'espressione da interpolare nella stringa letterale è semplicemente un riferimento a una variabile globale, istanza o classe, le parentesi graffe possono essere omesse.

Quindi dovrebbe funzionare tutto quanto segue:

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

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

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

4
Bella domanda, btw. È bello tornare indietro e ritrovare i piccoli angoli della lingua che avevo dimenticato.
tsherif

2
Sebbene la tua risposta non contenga un motivo o cosa sta succedendo, sto scoprendo che il motivo è difficile da individuare. Anche i vecchi forum su cui Matz commentava spesso non aiutano. Tuttavia, la tua risposta mostra che si tratta di una caratteristica anziché di un semplice colpo di fortuna.
Charles Caldwell

1
Non sono sicuro di cosa ti aspetti come motivo. Intendi come decisione progettuale? La mia ipotesi sarebbe che si trattasse di un tentativo di sintassi simile a Perl , dal momento che credo che Ruby sia stato originariamente concepito come una sorta di Perl ++ prima di entrare nel proprio campo.
tsherif

2
Sono un noob completo e il mio IDE si è lamentato di me che lo facevo. Ma sto facendo un duro lavoro convincendomi che sia un buon stile. È inutilmente incoerente e ha uno svantaggio: ad esempio, se ho una variabile di istanza @distance con valore 100 e voglio creare una stringa che dice qualcosa come "100m" usando un'espressione come "# @ distancem" ottengo solo una stringa vuota perché non esiste una variabile di istanza "distancem". Quindi questo suona come uno stile decisamente brutto.
terriblememory

3
@terriblememory Oh, è decisamente un cattivo stile. Ecco perché ho iniziato la mia domanda indicando il modo corretto di farlo. Tuttavia, ho appena trovato strano che fosse una caratteristica della lingua e mi sono chiesto perché funzionasse. Poi di nuovo, è anche cattivo stile iniziare una frase con una congiunzione. Ma vedrai ancora persone che lo usano qua e là. =)
Charles Caldwell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.