Java で Play Framework 2.0 に取っ組んでるわけですけど、
ビューの上であれこれ処理をしなきゃいけなくなると、どうしても Scala からは逃れられなくなっちゃいます。
たとえば、同じ画面の上で西暦も和暦も表示したいぞ!なんてとき。
あらかじめコントローラーで両方を計算しておいて、ビューの引数を増やせば済むよね!
という力技ももちろんあるにはあるけれど、せっかくの Play! 2.0 なんだから Scala 使わなきゃ。
ということで、ビューの上で Scala で処理しちゃいましょう、というのが今回のお話です。
Scala 初心者なので、スマートさにはずいぶん欠けるかもしれません。
でも、Scala をかじるきっかけにはなるでしょうし、
「あ、こんな感じね」というヒントにはなるかなーと考えてます。
そのうち、もうちょっとブラッシュアップできてくといいかなー。
ひとまずソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@(pageData: pages.TestPageData) @getWareki(in: String) = @{ import java.util.Date var wareki = 0 try { wareki = Integer.parseInt(in.trim) } catch { case e: NumberFormatException => wareki = Integer.parseInt("%tY" format new Date) } wareki = wareki - 1988 Some(wareki.toString()) } <!DOCTYPE html> <html> <head> ..... <span>平成 @getWareki(pageData.year) 年度</span> ..... |
ビューの一番アタマの部分です。
ページの引数として、pages.TestPageData クラスのオブジェクトを受け取ってます。
デフォルトでは pages なんていうパッケージはありませんが、
ページで扱うデータは pages パッケージのクラスに、フォームで扱うデータは forms パッケージのクラスに
それぞれ格納するのがうちの癖です。
やっぱり直観的にわかるのが一番いいですしね。
次がビューでの Scala のメソッドの宣言方法です。
1 |
@getWareki(in: String) = @{ ..... } |
こんな風に書きます。
@getWareki がメソッド、(in: String) で String 引数型の引数を in という変数名で扱います。
ちなみに、一般的な Scala プログラムで同じ内容を記述すると
1 |
def getWareki(in: String) = ..... |
となります。
1 |
import java.util.Date |
Scala は Java ベースの言語で、Java のライブラリをそのまま扱えるという特性を持っています。
ここでも java.util.Date をそのまま使ってしまいます。
また、文末に「 ; 」セミコロンがありませんけれど、誤植じゃありません。
Scala は明示的にセミコロンを書かなくても、適切に処理してくれます。
1 |
var wareki = 0 |
変数の定義をします。定義の方法には val と var の2種類があります。
val は定義すると値を変更することはできません。Java の static のように使うことができます。
var は一般的な変数です。
型の宣言がありませんが、Scala ではこれは普通のことです。
Scala のコンパイラには強力な型推測機能があります。
明示的に型が推論できる場合には省略してしまうことができます。
1 2 3 4 5 6 |
try { wareki = Integer.parseInt(in.trim) } catch { case e: NumberFormatException => wareki = Integer.parseInt("%tY" format new Date) } |
入力値を trim して、Integer で受け取っているだけの処理です。
try ~ catch 文は Java でも見なれたものです。
ただし、Exception を case 文で受け取るところが違います。
もう一つ見なれない => はパターンマッチした時を示します。
まさに矢印そのものと捉えていいと思います。
1 |
wareki = Integer.parseInt("%tY" format new Date) |
では、Scala の StringLike.format メソッドを使って、現在日付から、年の部分のみを抽出しています。
StringLike.format については、ここらへんを参考にするとよいかもです。
1 2 |
wareki = wareki - 1988 Some(wareki.toString()) |
西暦を和暦(平成)に変換するために1988を引いています。
年号が変わったら‥‥その時はその時で!
Some(…) は、Scala の Option というラップクラスの子クラスです。
Option クラスは、値が Null のときでも NullPointerException を返さないという特徴があります。
値があるときは、Some(…) の中身を、処理に失敗した時は None オブジェクトを返してくれます。
戻り値を明示していませんが、これも Scala の特徴です。
最後の行で処理した結果を、自動的に戻り値として返してくれます。
今回の場合は Some(wareki.toString()) の結果を返します。
もし、結果がマイナスになっちゃった!という人は、入力値を疑ってくださいね。
もともとの年度が Javascript で生成したものであるなら、
ブラウザによっては 1900 年からの差分を返す場合があります。
javascript 側でこんな風に記述しておくとよいかもです。
1 |
if(year < 2000){ year += 1900; } |
1 |
<span>平成 @getWareki(pageData.year) 年度</span> |
実際の表示部分ではこんな風に使います。
というわけで、今回は Scala を少しかじってみました。
コントローラーで処理するか、ビューで処理するかは好みの分かれるところだと思いますが、
ビューで処理する方法も覚えておくと、柔軟に対応できていいんじゃないかなーと思ってます。
Scala について、もう少し深く触れておきたいなー、という場合は、
この2冊がおすすめです。
「Scala プログラミング入門」は、これまで Java で書いてきたけど、
Scala もかじってみたいという人に最適。
「Scala スケーラブルプログラミング」は通称「コップ本」と呼ばれているバイブル的な存在です。
2冊まとめてもとめておくと、今後も活用できるはずです。