🎉

Ruby で {} を省略した式展開

2025/01/03に公開

Ruby に関するニッチなネタです。
さて、Ruby では文字列リテラルで #{式} を書くことで文字列リテラル内に任意の式を記述することができます。

# #{} 内のコードの結果が文字列として埋め込まれる
p "1 + 2 = #{1 + 2}"
# => "1 + 2 = 3"

# 変数も埋め込むことができる
result = 3 + 4
p "3 + 4 = #{result}"
# => "3 + 4 = 7"

これがいわゆる文字列リテラルの式展開と呼ばれている構文になります。
この式展開なんですが #{} 以外にも書き方があります。

#$#@ #@@ でグローバル変数やインスタンス変数、クラス変数が参照できる

次のようにグローバル変数やインスタンス変数、クラス変数は {} を省略して書くことができます。

$global = "42"
@instance = 3.14

p "global = #$global"     # => "global = 42"
p "instance = #@instance" # => "instance = 3.14"

class X
  @@class = name
  p "class = #@@class" # => "class = X"
end

こんな感じで #変数名 でその変数が展開されます。
ちなみにローカル変数は展開されません。

local = 42
p "#local" # => "#local"

おまけ: "#$" を実行するとどうなる?

"#$" を実行するとどうなるでしょう。
パッと見、 #$ が文字列として定義されるように見えますがこれはシンタックスエラーになります。

# Syntax error: unterminated string; expected a closing delimiter for the interpolated string
p "#$"

これは # + $" となりグローバル変数 $" を参照するような構文になってしまうからです。
$" はロードされたファイル名の配列ですね。

先に紹介した "#グローバル変数" という書き方がわかっていればまだ理解できますが、知らないと絶対にわからないですよねえ。

参照

GitHubで編集を提案

Discussion