scala - Scala 可以作为隐式转换的隐式参数的方法参数?

  显示原文与译文双语对照的内容
84 5

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,转换器:转换器): Foo = Bar ( x )

如果不是明显的( implicits ),我试图做的是将 Bar(x) 隐式转换为 Foo 。 隐式转换本身由隐式 Converter 参数化。 我想使用这个转换的时候都有一个 Converter 实例作为方法的参数。

I Bar find implicit,但我认为隐式转换可能具有隐式参数,但实际上编译器已经认为这是一个错误,因此我期望它能死于。

我发现另一个问题详细回答了 Scala 在哪里查找 implicits 。 但它只确认了我以前的理解: 这个 Scala 首先在即时范围内,然后是一组在这里不相关的其他地方。

我想知道,当检查当前的值作为隐式参数时,Scala 不会查看本地方法参数。 但是添加一些类似的东西 val c = converterroundaboutFoo 不会更改所得到的错误信息。

这个能不能? 如果没有,有人可以帮助我了解如何识别这样的代码不会工作。

时间: 原作者:

88 2

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)


}



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

原作者:
...