REPL会话中的以下代码:
case class Foo(x : Int)
case class Bar(x : Int)
case class Converter(y : Int) {
def convert(x : Int) = x + y
}
implicit def fooFromBar(b : Bar)(implicit c : Converter) = Foo(c convert (b x))
def roundaboutFoo(x : Int, converter : Converter) : Foo = Bar(x)
给我这个错误:
错误:找不到参数c的隐含值:转换器 def roundaboutFoo(x:Int,converter:Converter):Foo = 巴(x)的
如果不明显(暗示),我正在尝试将Bar(x)
隐式转换为Foo
。隐式转换本身虽然由隐式Converter
参数化。我想要使用此转换的时间都有一个Converter
实例作为方法的参数。
由于Bar
不是来自Foo
的简单函数,因此无法找到从fooFromBar
到Foo
的隐式转换,因此我预计会因此而死亡到Bar
,但我读in this question隐式转换可以有隐式参数,实际上编译器似乎已经计算出这部分。
我找到了another question,详细解答了Scala寻找填充内容的地方。但它只证实了我之前的理解:Scala首先在直接范围内,然后是一堆其他与此无关的地方。
我想知道发生了什么事情是Scala在检查作为隐式参数传递的值的本地范围时不查看本地方法参数。但是向val c = converter
添加roundaboutFoo
之类的内容并不会更改我收到的错误消息。
这可以使用吗?如果没有,任何人都可以帮助我理解要查找的内容,以确认这样的代码不起作用吗?
答案 0 :(得分:6)
converter
需要是一个隐含参数本身:
def roundaboutFoo(x: Int)(implicit converter: Converter): Foo = Bar(x)
或分配给隐含的val:
def roundaboutFoo(x: Int, converter: Converter): Foo = {
implicit val conv = converter
Bar(x)
}
常规参数不是隐式的,因此在尝试填充隐式参数时不会被搜索。