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可用的实例作为方法的参数.
我半预计将不能够从发现的隐式转换死Bar到Foo,由于fooFromBar不是从一个简单的函数Foo来Bar,但我读的这个问题是隐式转换可以有隐含参数,实际上编译器似乎有部分出来了.
我发现了另一个问题,详细解答了Scala寻找填充内容的地方.但它只证实了我之前的理解:Scala在直接范围内首先看起来,然后是其他一些与此无关的地方.
我想知道发生了什么事情是Scala在检查作为隐式参数传递的值的本地范围时不查看本地方法参数.但添加类似val c = converter,以roundaboutFoo不改变错误消息我得到.
这可以使用吗?如果没有,任何人都可以帮助我理解要寻找什么来识别像这样的代码不起作用?
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)
常规参数不是隐式的,因此在尝试填充隐式参数时不会搜索.
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |