置換の選択肢
Rubyでは文字列置換にはいくつも選択肢がある.
- #{}で式評価
- % 記法でハッシュ渡し
- String.gsub()でハッシュ渡し
- Kernel#format()
- 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)'' がいいのではなかろうかと.