Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2012年05月13日(日)

埋め込み変数

15:14 | 埋め込み変数 - Going My Ruby Way を含むブックマーク はてなブックマーク - 埋め込み変数 - Going My Ruby Way 埋め込み変数 - Going My Ruby Way のブックマークコメント

「埋め込み変数」というのがあります。

  @@var = 1
  @var = 2
  $var = 3

  # 埋め込み変数
  p "#@@var"     #=> "1"
  p "#@var"      #=> "2"
  p "#$var"      #=> "3"

  # 以下の式展開と同じ効果
  p "#{@@var}"  #=> "1"
  p "#{@var}"   #=> "2"
  p "#{$var}"   #=> "3"

朧げな記憶ですが、Ruby 1.6 の頃には既にあったと思います。

Ruby 1.9.3 でも有効です。

ただし、現在のリファレンスには記述が見つけられませんでした。

仕様的(特に将来的な)扱いは不明です。

Ruby のソース parse.y (https://github.com/ruby/ruby/blob/trunk/parse.y)の非終端記号 string_dvar の辺りを見る限り、対応するのは

  • クラス変数
  • インスタンス変数
  • 外部変数

だけのようです。

式展開可能な引用、%記法、ヒアドキュメントの中でも有効です。

  @cmd = 'ls'

  p /#@cmd/    #=> /ls/
  p `#@cmd`    #=> (コマンド ls の出力。環境によって異なります)
  p %Q<#@cmd>  #=> "ls"
  p %W[#@cmd]  #=> ["ls"]
  p <<-EOS     #=> "ls\n"
  #@cmd
  EOS

意図せず使って結果に驚くことは、ごく稀にあるかもしれません。

p "#@var"    #=> "" (@var が未定義の場合)

----

「埋め込み変数」

そもそも「埋め込み変数」と公式に呼ぶかは不明です。記憶も朧げです。

Ruby 埋め込み変数」でググっても、「Ruby 組み込み変数」の検索結果に勝手に差し替えてくれやがります。

一応、本blogでは、以下のように分類しときます。

p "#@var"     # 埋め込み変数 (embedded variable)
p "#{@var}"   # 式展開、埋め込み式 (embedded expression)

=begin        # 埋め込みドキュメント (embedded document)
 hoge fuga
=end

p <<S         # ヒアドキュメント (here document)
 hoge fuga
S