中括弧がないのに、Rubyで文字列補間が機能するのはなぜですか?


90

Rubyで文字列補間を使用する適切な方法は次のとおりです。

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

それが私がいつも使っている方法です。

しかし、Rubyの文字列補間に何か奇妙なことに気づきました。文字列補間は、インスタンス変数に関して中括弧なしでRubyで機能することに気づきました。例えば:

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

そして、非インスタンス変数と同じことを試みても機能しません。

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

私はこれを1.9.2と1.8.7の両方で成功させて試しました。

なぜこれが機能するのですか?通訳はここで何をしていますか?

回答:


103

FlanaganとMatsumotoによるRubyプログラミング言語によると:

文字列リテラルに補間される式が単にグローバル変数、インスタンス変数、またはクラス変数への参照である場合、中括弧は省略できます。

したがって、以下はすべて機能するはずです。

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

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

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

4
かっこいい質問、ところで。戻って、私が忘れていた言語の小さな隅を見つけるのはいいことです。
tsherif 2012

2
あなたの答えには理由や何が起こっているのかは含まれていませんが、理由を突き止めるのは難しいと思います。マッツが頻繁にコメントした古い掲示板でさえ、役に立たない。しかし、あなたの答えは、それが単なるまぐれではなく機能であることを示しています。
Charles Caldwell

1
理由として何を期待しているのかわかりませんが。設計上の決定という意味ですか?Rubyは元々、Perl ++の一種として考えられていたので、それはPerlのような構文の試みだったと思います。
tsherif 2012

2
私は完全な初心者で、IDEにこれを行うことについて文句を言わせました。しかし、私はそれが良いスタイルだと自分自身に納得させるのに苦労しています。それは無意味に一貫性がなく、欠点があります-たとえば、値100のインスタンス変数@distanceがあり、「#@ distancem」のような式を使用して「100m」のような文字列を作成したい場合は、空白の文字列を取得しますインスタンス変数「distancem」がないためです。だから、これはまったく悪いスタイルのように聞こえます。
terriblememory

3
@terriblememoryああ、それは間違いなく悪いスタイルです。だから私は正しいやり方を指摘することから質問を始めました。しかし、それが言語の特徴であることに奇妙に気づき、なぜそれが機能するのか疑問に思いました。また、接続詞で文を始めるのも悪いスタイルです。しかし、あなたはまだあちこちでそれを使用している人々を見るでしょう。=)
Charles Caldwell 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.