

関数オブジェクトを作るときに暗黙のパラメータをどう渡すべきなのでしょうか。

次のように、何も指定しないとエラーになります（val process = の部分）。

[code]

    case class Cache(key: Int, value: String)
    
    class Processor {
      val process = processF _  // could not find implicit value for parameter cache: this.Cache
    
      private def processF()(implicit cache: Cache): String = cache.value
    }
    
    object Main {
      def run() {
        implicit val cache = Cache(10, "hello")
    
        val processor = new Processor
        processor.process()
      }
    }
    
    Main.run
    
[/code]

こんなかんじで書ければいいのですが、うまくいきません。

[code]

    val process: ()(implicit cache: Cache) => String = processF _ // シンタックスエラー
    
[/code]

そもそも可能かどうかもわかりませんが、どういったアプローチが有効かお教え願えますでしょうか。よろしくお願いいたします。


CC BY-SA 3.0
2015-12-11T12:03:32.840
19885
2016-04-09T21:40:48.617
3166
question
scala
関数オブジェクトを作るときに暗黙のパラメータをどう渡すか


質問者さんの意図に合致するかどうかわかりませんが、コンストラクタの引数を`implicit`にして渡してやるというのはどうでしょう。  
（簡単のため`Main`オブジェクトを`App`にしました。)

[code]

    case class Cache(key: Int, value: String)
    
    class Processor(implicit c: Cache) {
      //implicit val cache2 = Cache(20, "hola")
      val process = processF _
      private def processF()(implicit cache: Cache): String = cache.value
    }
    
    object Main extends App {
      implicit val cache = Cache(10, "hello")
      val processor = new Processor
      println(processor.process())
    }
    
[/code]

`cache2`のように`val`の前に`implicit`があればそれを見に行ってくれるようです。


CC BY-SA 3.0
2015-12-11T14:41:59.990
19892
2015-12-11T14:57:36.517
2015-12-11T14:57:36.517
13199
13199
19885
answer