我对匿名函数的隐式参数有点困惑。希望有人能指出正确的方向。这就是我所拥有的。两个文件:Main.scala
和Foo.scala
:
// Foo.scala
trait Fun[-A, +B] extends (A => B)
trait ImplicitString[+B] {
def withString(block: String => B)(implicit s: String): B = block(s)
}
object FooFun extends Fun[String, String] with ImplicitString[String] {
def apply(x: String): String = withString { implicit s =>
x + s
}
}
和
// Main.scala
object Main extends App {
implicit val s = "it works!"
println(FooFun("Test:"))
}
我希望看到Test: it works!
打印出来。但是我收到了编译错误:
$ scalac Main.scala Service.scala
Service.scala:8: error: could not find implicit value for parameter s: String
def apply(x: String): String = withString { implicit s =>
^
one error found
我错过了什么吗?
更新:
看起来我应该像这样导入我的隐式val:
// Foo.scala
import Main._
...
这很好用。
答案 0 :(得分:1)
如果您要在函数内直接使用s
,那么就没有必要将其标记为隐式。
你可以用这种方式解决这个问题,
object FooFun extends Fun[String, String] with ImplicitString[String] {
def apply(x: String)(implicit s1:String): String = withString { s =>
x + s
}
}
问题是,implicit val s
的申请方法正文无法看到FooFun
。