具有自己的上下文绑定的类

时间:2016-02-27 08:29:26

标签: scala implicits

以下作品:

trait Context[T] {
    def context(x: T): String

class Foo[T : Context](x: T) {
    def bar() = implicitly[Context[T]].context(x)
}

implicit val c = new Context[Double] { 
    override def context(x: Double): String = "I am a double"
}

val f = new Foo(2.0)
f.bar() // I am a double

所以我想......如果我构建一个在其中有自己的Context定义的类也可以吗?

object Foo {
    def apply[T : Context](x: T) = new Foo[T](x)
    def apply[T](x: T, contextFunc: T => String): Foo[T] with Context[T] = new Foo[T](x) with Context[T] {
        override def context(x: T): Double = contextFunc(x)
    }
}

val f2 = Foo[Double](2.0, x => "I am still a double")

但它开始抱怨第二个应用函数中缺少隐含证据。我可以想象,因为看起来它开始首先使Foo类,然后开始制作Context [T]特征。

有没有办法解决这个问题?换一种说法?有没有办法构造一个有自己的Context [T]的Foo类?

1 个答案:

答案 0 :(得分:2)

最简单的方法可能是在构造Foo时构造一个上下文对象并明确地将其作为参数传递:

def apply[T](x: T, contextFunc: T => String): Foo[T] = 
  new Foo(x)(new Context[T] {
    def context(t: T) = contextFunc(t)
  })