Scala:如何使用隐式参数定义匿名函数?
Scala: How to define anonymous function with implicit parameter?
我想用这样的方式定义一个带有隐式参数的函数:
// imports to add scope of A
{
implicit a: A => {
// some action
}
}.apply()
// somewhere in the code
class A
val a: A = new A
但是我的 Scala
编译器没有编译它。它说:Cannot resolve reference apply with such signature
。但是,该参数是隐式的,所以我想编译器应该在作用域中查找并找到合适的对象。
这是真的吗?如果没有,那我该如何解决?
你不能。只有方法可以有隐式参数。
当你这样做时:
// val f: A => Unit =
{
implicit a: A => {
// some action
}
}
您实际上是在声明一个类型为 A => Unit
的匿名函数,并且您在函数体 中将参数 a
声明为隐式
您可以使用磁铁图案实现接近您想要的效果:
class A
case class Magnet()
object Magnet {
implicit def fromUnit(arg1: Unit)(implicit a: A) = Magnet()
}
object Test extends App {
implicit val a = new A
{
args: Magnet => {
//...
}
}.apply()
}
不过你会收到弃用警告,因为磁铁必须至少有一个参数,而我使用了 Unit
,你应该像 .apply(())
那样称呼它以避免它
正如 Giovanni 所说:你不能有这样的参数。
但是,您可以使用 implicitly
来解析函数中的隐式:
case class Foo(text : String)
implicit val foo = Foo("World")
(() => {
val implFoo : Foo = implicitly[Foo]
println(s"Hello ${implFoo.text}")
}).apply()
(但老实说,这听起来可以写得更好,而且您正在做的事情将进入意大利面条式代码领域。)
我想用这样的方式定义一个带有隐式参数的函数:
// imports to add scope of A
{
implicit a: A => {
// some action
}
}.apply()
// somewhere in the code
class A
val a: A = new A
但是我的 Scala
编译器没有编译它。它说:Cannot resolve reference apply with such signature
。但是,该参数是隐式的,所以我想编译器应该在作用域中查找并找到合适的对象。
这是真的吗?如果没有,那我该如何解决?
你不能。只有方法可以有隐式参数。
当你这样做时:
// val f: A => Unit =
{
implicit a: A => {
// some action
}
}
您实际上是在声明一个类型为 A => Unit
的匿名函数,并且您在函数体 中将参数 a
声明为隐式
您可以使用磁铁图案实现接近您想要的效果:
class A
case class Magnet()
object Magnet {
implicit def fromUnit(arg1: Unit)(implicit a: A) = Magnet()
}
object Test extends App {
implicit val a = new A
{
args: Magnet => {
//...
}
}.apply()
}
不过你会收到弃用警告,因为磁铁必须至少有一个参数,而我使用了 Unit
,你应该像 .apply(())
那样称呼它以避免它
正如 Giovanni 所说:你不能有这样的参数。
但是,您可以使用 implicitly
来解析函数中的隐式:
case class Foo(text : String)
implicit val foo = Foo("World")
(() => {
val implFoo : Foo = implicitly[Foo]
println(s"Hello ${implFoo.text}")
}).apply()
(但老实说,这听起来可以写得更好,而且您正在做的事情将进入意大利面条式代码领域。)