置換の選択肢

Rubyでは文字列置換にはいくつも選択肢がある.

  1. #{}で式評価
  2. % 記法でハッシュ渡し
  3. String.gsub()でハッシュ渡し
  4. Kernel#format()
  5. Kernel#sprintf()


どう使い分ければいいのだろう?というのは,HTMLでのマークアップにはダブルクォーテーションがあるため,文字列中に変数展開をするとHTML片がまことみにくいことになる.なんとかならないものだろうか? 回答は以下.

単なる置換の場合

'<a href="' + val + '"></a>'   # もっとも原始的

"<a href=\"#{val}\"></a>"         # 式展開,しかし,バックスラッシュが醜い

%(<a href="#{val}"></a>)          # %記法ダブルクォート   ...(1)変数の場合; こうするしかないのか?
'<a href="%s"></a>' %  val        # String#% 書式付文字列 ...(2) フォーマット付
'<a href="%s_%02d.jpg"></a>' %  [val, 1]    
                                  # String#% 書式付文字列 ...(2)' フォーマット付(複数引数)
                                  # これらは,format()やsprintf()と実質同じ.

'<a href="{val}"></a>'.gsub(/\{(.*?)\}/){|word| vals[$1]}  
                                  # String#gsub(re,&)     ... (3) キーが文字列の辞書の場合(JSONなど)
                                  # パフォーマンス悪そう

'<a href="%{val}"></a>' % { :val => "sample.jpg"}
'<a href="%{val}"></a>' % { val: "sample.jpg"}
                                  # String#% 書式付文字列 ... (2)'' キーがシンボルなら
                                  # JSON.parse(jsonstring, symbolize_names: true) とか便利.
                                  # 名前が付けられるので自由度が高い.

'<a href="%<val>s %<n>04d.jpg"></a>' % {val: "sample", n: 1}   
                                  #                       ... (2)''' 置換と書式指定を同時にできる


(2)'' がいいのではなかろうかと.