成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Scala2.10の新機能を勉強する その1 StringInterpolation

久々のブログですが、
今更ながらScala2.10の新機能をちゃんと勉強しておこうと思います。

※終わったらRuby2.0やろうと思ってますが、、、

今回のテーマ

StringInterpolation
です。

環境

StringInterpolationって?

Rubyの式展開のように、文字列リテラル内に、式を書く事ができる機能です。

Interpolationって、どういう意味だろうか、、、
初めて聞いたので、意味がわからず、、調べてみました。

alc

http://eow.alc.co.jp/search?q=interpolation&ref=sa
→〔他のものに〕挿入すること、差し挟むこと

なるほど、文字列になんか差し込むので、StringInterpolation、なんですね。
とりあえず言葉の意味は理解できました。

式を埋め込んでみる

まずは、単純に変数の値を埋め込んでみます。

これで、

Hello hoge!

となります。
Rubyの記法に比べると{}が無くて、#が$になった感じですね。

では、次に、計算式やらメソッド呼び出しやらを埋め込んでみます。

ここでは{}が必要な場面が登場しました。
変数もしくは引数なしのメソッド呼び出しは{}は不要ですが、
それ以外は必要になるようです。
※当然といえば当然ではある、、、。

フォーマットを指定して埋め込む

次はフォーマットを指定して値を埋め込んでみたいと思います。

ここで最後の行はエラーになりました。
コメントにも書きましたが、
piはDouble型になるので、Intを期待するフォーマット「%d」は使えません。
※コンパイル時にエラーになります

[error] /xxxx/workspace/scala-samples/scala-2.10-sample/src/main/scala/interpolation/StringInterpolation_03.scala:10: type mismatch;
[error]  found   : Double
[error]  required: Int
[error]   println(f"$hoge is $pi%2.4d") // これはpiがDoubleなので、エラーになる
[error]                       ^
[error] one error found
[error] (compile:compile) Compilation failed

仕組みを知る

このStringInterpolationの仕組みはStringContextのメソッド飛び出しで実現されているようです。
試してみます。

こんな感じ。

hoge"...."

これは

StringContext(....).hoge(....)

に展開されるようなので、
ImplicitConversionと組み合わせれば、他にも便利なリテラルが実現できそうです。

他の機能を勉強してからやってみたいと思います。