LL脳がscalaの勉強を始めたよ その88


Scalaコップ本の25章にはいりますよ(´・ω・`)25章はアノテーションについてやるみたいですね。アノテーションとは構造化されたコメントで機械処理できたりするみたいデス

アノテーションを使う理由

コンパイル実行以外での理由でプログラムを入力するプログラムをメタプログラミングツールと呼んだりするのですが、アノテーションを利用してそのようなツール用処理を埋め込んだりすることでツールをサポートすることが出来るみたいです。

メタプログラミングの例としては次のようなモノがありますね

  • ドキュメントジェネレーター
    • Scaladocなどのドキュメントの自動生成
  • 出力整形プログラム
    • 好みのスタイルに合わせたコードの出力
  • クローズされていないファイルチェックプログラム
    • ファイルをオープンしながらクローズしない場合があるなど、よくあるエラーのチェック
  • 副作用チェッカー
    • 副作用の管理や所有者プロパティの確認などを目的とした実験的な型チェック

アノテーションによって上記ツールは次のように改善できるみたいですね

  • ドキュメントジェネレータでは一部のメソッドを「使わないほうがよいもの」として記述するように指定
  • 出力整形プログラムでは手作業で丁寧に整形してある部分を処理しないように指示
  • クローズされていないファイルチェックプログラムでは、クローズされていることを別途確認して、とあるファイルを無視するよう指示
  • 副作用チェッカーには、指定されたメソッドに副作用が無いことを確かめるよう指示

アノテーションはこれらを実現するためにプログラムに対して補助情報を埋め込んでいく手段にわけですね(´・ω・`)各補助情報を個別に定義するわけではなくアノテーションという手段だけを提供するのがScala流(超意訳)とのことです。なので自分専用アノテーションを自由自在に定義できるYO!とのことですな。

アノテーションの構文

とりあえずアノテーションの書き方サンプルは次のようになりますネ。アノテーションの意味合い的には「ひどいコードなので削除予定」という意味合いみたいです。

// アノテーションは@マーク始まりで記述しますね
@deprecated def bigMistake() = //...

上記はメソッドに対するアノテーションの例ですが、アノテーションはval, var, def, class, object, trait, typeなど様々なものに付与することが可能みたいですね(`・ω・´)例えばclassにアノテーションをつけると下記のようになりますね

// これまたひどいコードなので削除予定です
@deprecated class QuickAndDirty {
  //...
}
|<

上記意外にもの様々なアノテーション定義ができるみたいですねー

*** アノテーションの式適用

そういや15章でコンパイラによる徹底的なチェックをしないという@uncheckedを使ったのですが、こいつもアノテーションですね(´・ω・`)15章では次のようにアノテーションを式にも適用してました。
>|scala|
// 式後に:を付与してアノテーションを記述します
(x: @unchecked) match {
  // 徹底的にはチェックしませんよ、のコンパイラ向けアノテーション定義です
}

式の他に型に適用するアノテーションもあるみたいですが、あとの節で出てくるみたいです

アノテーションの一般形

これまで出てきたアノテーションは、アノテーションの後にアノテーション対象を記述する単純な形式でしたが、より複雑な一般形としては次のようなものがあるみたいです。

@<アノテーション>(<式>, <式>, ...) {val <名前>=<定数>, ... ,  <名前>=<定数>}

上記の<式>の部分はアノテーションに対する引数で、例えば@serial(1234)のように記述するみたいです。逆に前出の@deprecatedなんかは引数なしなので省略しております。なので@deprecated()みたいに書いてもOKみたいデス(´・ω・`)また、コンパイラ的には引数である<式>部分で型チェックを満たす式もサポートするみたいです。

また、アノテーション引数内でスコープ内の他の変数を指定することも可能みたいですね。

@cool val normal = "Hello"

// 引数で他の変数を利用してみますよ
// 意味合い的にはnormal変数の内容よりもcoolっていう意味合いみたいです
@coolerThan(normal) val fonzy = "Heeyyy"


また、上記のval <名前>=<定数>では<式>部分での単純な引数ではなく任意の順序で指定できるようなオプションみたいです(´・ω・`)

以上ー

時間切れなので今回はここまでです、次回は標準アノテーションからやりますよー