隐式参数的 Scala 隐式转换
Scala implicit conversion of implicit argument
我正在尝试编写一些代码来转换隐式参数,如下所示:
case class A()
case class B()
object B {
implicit def b2a(b: B): A = new A()
}
def foo(f: B => String) = f(new B())
def bar(implicit a: A) = "A"
foo { implicit b =>
bar()
}
给出错误:
<console>:27: error: not enough arguments for method bar: (implicit a: A)String.
Unspecified value parameter a.
有没有办法不用手动调用就可以使用隐式转换?
我认为这违反了 "one at a time" 规则。在您对 bar
的调用范围内没有隐式 A
,只有隐式 B
。如果编译器还试图将隐式 B
隐式转换为 A
,那将是两个步骤,而不是一个。
但是,您可以通过隐式链接解决这个问题。
implicit def a(implicit b: B): A = new A()
如果此方法在范围内,编译器将在范围内看到隐式 A
,只要它可以填充隐式 B
,它就可以。
scala> foo { implicit b => bar }
res1: String = A
您遇到的具体错误是因为您需要删除括号,我在这里就是这样做的。这会导致 "implicit not found" 错误,如上所述。
我正在尝试编写一些代码来转换隐式参数,如下所示:
case class A()
case class B()
object B {
implicit def b2a(b: B): A = new A()
}
def foo(f: B => String) = f(new B())
def bar(implicit a: A) = "A"
foo { implicit b =>
bar()
}
给出错误:
<console>:27: error: not enough arguments for method bar: (implicit a: A)String.
Unspecified value parameter a.
有没有办法不用手动调用就可以使用隐式转换?
我认为这违反了 "one at a time" 规则。在您对 bar
的调用范围内没有隐式 A
,只有隐式 B
。如果编译器还试图将隐式 B
隐式转换为 A
,那将是两个步骤,而不是一个。
但是,您可以通过隐式链接解决这个问题。
implicit def a(implicit b: B): A = new A()
如果此方法在范围内,编译器将在范围内看到隐式 A
,只要它可以填充隐式 B
,它就可以。
scala> foo { implicit b => bar }
res1: String = A
您遇到的具体错误是因为您需要删除括号,我在这里就是这样做的。这会导致 "implicit not found" 错误,如上所述。