Locked History Actions

Diff for "scala/implicit"

Differences between revisions 3 and 4
Deletions are marked like this. Additions are marked like this.
Line 35: Line 35:
== 供給側を関数に変更 == === 供給側を関数に変更 ===
Line 39: Line 39:
  // 暗黙的に供給されるオブジェクト。implicitを記述する
Line 44: Line 43:
  // 暗黙的に供給されるオブジェクト。implicitを記述する
Line 51: Line 49:
=== 供給側をオブジェクトに変更 ===

供給側をオブジェクトに変更してもよい。
{{{
  implicit object toBeImplicitArg extends Sample(1) {}
}}}

つまり、implicitとマークされた引数に供給できるものは、implicitのvalに限ることなく、implicitのdefやimplicitのobjectでもよい。

Line 52: Line 60:

implicit

暗黙のパラメータ

implicitとマークされた引数は、その型と一致し、implicitとマークされたオブジェクトが存在すれば自動的に供給される。

object ImplicitTest {

  class Sample(value: Int) {
    override def toString = { "Sample:" + value }
  }

  // 暗黙的に供給されるオブジェクト。implicitを記述する
  implicit val toBeImplicitArg = new Sample(1);

  // implicitとマークされた引数を持つメソッド。implicitを記述する。
  def methodWithImplicitArg(implicit s: Sample) {
    println("methodWithImplicitArg called:" + s)
  }

  def main(args: Array[String]) {
    methodWithImplicitArg // 暗黙的に供給
    methodWithImplicitArg(new Sample(2)) // 明示的に供給
    // methodWithImplicitArg() ... この場合、()をつけてはだめ。引数が不足と言われてしまう。
  }
}

この結果は

methodWithImplicitArg called:Sample:1
methodWithImplicitArg called:Sample:2

供給側を関数に変更

上記の

  implicit val toBeImplicitArg = new Sample(1);

は、関数に変更しても機能する。

  implicit def toBeImplicitArg: Sample = new Sample(1)

つまり、固定的な値だけではなく、引数が必要になったその場で値を作成することもできるのだが、 このままでは同じ値「new Sample(1)」しか作成されない。 呼び出される「文脈」をtoBeImplicitArg関数に与え、その場に応じた値を作成できないとまったく面白くはない。

供給側をオブジェクトに変更

供給側をオブジェクトに変更してもよい。

  implicit object toBeImplicitArg extends Sample(1) {}

つまり、implicitとマークされた引数に供給できるものは、implicitのvalに限ることなく、implicitのdefやimplicitのobjectでもよい。

その場に応じた引数値を生成する方法