読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Implicit Parameter

関数のパラメータに「implicit」をつけておくと、関数の呼び出し時にその引数を省略できるようになります。省略された引数には、メソッドの呼び出し元コンテキストで一番それっぽいimplicit付きの値をコンパイラが選択して挿入してくれます。

  • 「implicit」は引数グループ?(「(<引数,引数..>)」。この表現はあっているのか?)の先頭にだけ指定でき、そのグループの引数全体が省略可能になります。
    • 普通の引数と混在させたい場合は、普通の引数だけ別のグループにして、そっちには「implicit」をつけなければOK。このとき、「implicit」付きのグループは関数の最後にする必要があります。
// 以下の3つはOK
def aaa( implicit s:String ) = ""
def bbb( )( implicit s:String ) = ""
def ccc( implicit i:Int, s:String ) = ""

// 次の2つはコンパイルエラー
//def xxx( i:Int, implicit s:String ) = "" // 個別の引数には指定できない
//def xxx( implicit s:String )( i:Int ) = "" // implicit付きのグループは最後にする必要がある。
  • 関数の呼び出し時には、「implicit」をつけた引数グループの引数は省略でき、
    • コンパイラがそのコンテキストで最適な「implicit」付きの値を選択し補完します。
    • 適合する値が見つからない場合、コンパイルエラーになります。
    • 省略せず明示的に指定することも可能です。

以下はImplicit Parameterを使った関数のサンプルです。

// テスト用のクラス
class Kitten(age:Int, name:String) {
    def getAge = age 
    def getName = name
}
trait KittenFactory {
    def create(age:Int,name:String):Kitten
}

object Factory {

    // 「implicit」なパラメータを持つ関数
    // 引数factoryは省略可能で、呼び出し元メソッドのコンテキストで最適な
    // KittenFactoryのインスタンスが探索され、利用される。
    def createKitten( age:Int, name:String )( implicit factory:KittenFactory ) =
        factory.create( age, name )   

}

object ImplicitParameterSample {
  def main(args: Array[String]) {
    
    // implicit付きのKittenFactoryのインスタンス
    implicit var factory = new KittenFactory {
        def create(age:Int,name:String):Kitten = new Kitten(age, name)
    }
    // 引数factoryを省略してメソッドを実行。
    // factoryには↑で定義した実装がヒットし、利用される。
    println( Factory.createKitten( 1, "mii" ).getName )
    
    
    var f = new KittenFactory {
        def create(age:Int,name:String):Kitten = new Kitten(age, name + "x")
    }
    // 明示的に指定することもできる。
    println( Factory.createKitten( 1, "mii")(f).getName )
  }
}

実行結果。

mii
miix