方法参数可以作为隐式转换的隐式参数吗?

Ben*_*Ben 1 scala implicit

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)
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

错误:找不到参数c的隐含值:转换器def roundaboutFoo(x:Int,converter:Converter):Foo = Bar(x)

如果它不明显(暗示),我正在尝试做的是Bar(x)隐式转换为a Foo.隐式转换本身虽然是通过隐式参数化的Converter.我想要使​​用此转换的时间都有一个Converter可用的实例作为方法的参数.

我半预计将不能够从发现的隐式转换死BarFoo,由于fooFromBar不是从一个简单的函数FooBar,但我读的这个问题是隐式转换可以有隐含参数,实际上编译器似乎有部分出来了.

我发现了另一个问题,详细解答了Scala寻找填充内容的地方.但它只证实了我之前的理解:Scala在直接范围内首先看起来,然后是其他一些与此无关的地方.

我想知道发生了什么事情是Scala在检查作为隐式参数传递的值的本地范围时不查看本地方法参数.但添加类似val c = converter,以roundaboutFoo不改变错误消息我得到.

这可以使用吗?如果没有,任何人都可以帮助我理解要寻找什么来识别像这样的代码不起作用?

Rex*_*err 6

converter 需要是一个隐含的参数本身:

def roundaboutFoo(x: Int)(implicit converter: Converter): Foo = Bar(x)
Run Code Online (Sandbox Code Playgroud)

或分配给隐式val:

def roundaboutFoo(x: Int, converter: Converter): Foo = {
  implicit val conv = converter
  Bar(x)
}
Run Code Online (Sandbox Code Playgroud)

常规参数不是隐式的,因此在尝试填充隐式参数时不会搜索.