tkawachi Blog

Loan Pattern

最近仕事で scala を書いてまして、 Java 延長線上として使う分には全く問題ないのだが、 scala ぽいこととなるとかなり怪しい。 なので初歩から少しずつ勉強して、その様子を晒しておくことにする。

今日は loan pattern。 リソース解放を忘れずに行うためのパターン。 C++ では RAII, golang では defer を使う場面で使うやつ。

以下、基本形。

1
2
3
4
5
6
7
8
9
10
11
  def using[A, R <: {def close()}](r: R)(f: R => A): A =
    try {
      f(r)
    } finally {
      r.close()
    }

  // 使いかた
  using(new FileWriter("xyz")) {
    (f) => // f に対する操作
  }

ポイント

  • parameterized type の R には structural type で upper bound を指定する(R <: {def close()})。 これにより R には close() メソッドを持つ任意の型を受け付けられる。 Structural typing は scala で duck typing できる機能。便利。 R の upper bound に trait や class を指定すると継承関係がある型しか使えないので 汎用性が下がり残念な気持ちになる。注意。

それにしても名前が覚えづらい。

参考


2013/6/12: parameterized type R の指定には upper bound で structural type を指定するのではなく、 view bound (R <% {def close()}) で structural type を指定する方が汎用性が高い。

Comments