Scala:如何使用隐式参数定义匿名函数?
我想用如下方式定义一个带有隐式参数的函数:Scala:如何使用隐式参数定义匿名函数?,scala,implicit-conversion,Scala,Implicit Conversion,我想用如下方式定义一个带有隐式参数的函数: // imports to add scope of A { implicit a: A => { // some action } }.apply() // somewhere in the code class A val a: A = new A 但是我的Scala编译器没有编译它。它说:无法解析带有此类签名的引用应用。然而,参数是隐式的,所以我想编译器应该在范围中查找并找到合适的对象 这是真
// imports to add scope of A
{
implicit a: A => {
// some action
}
}.apply()
// somewhere in the code
class A
val a: A = new A
但是我的Scala
编译器没有编译它。它说:无法解析带有此类签名的引用应用
。然而,参数是隐式的,所以我想编译器应该在范围中查找并找到合适的对象
这是真的吗?如果没有,那么我如何修复它?您不能。只有方法可以有隐式参数 执行此操作时:
// 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
,您应该像一样调用它。应用(())
以避免它,正如Giovanni所说:您不能有这样的参数
但是,您可以使用隐式
在函数中隐式解析它:
case class Foo(text : String)
implicit val foo = Foo("World")
(() => {
val implFoo : Foo = implicitly[Foo]
println(s"Hello ${implFoo.text}")
}).apply()
(但老实说,这听起来似乎可以写得更好,而且你正在做的事情会让你进入一个意味深长的代码领域。)你真的不清楚你想要实现什么,至少我想启动一个函数并强制它使用隐式参数。我不想显式地将参数传递给函数。哦,好吧,我明白你的意思,我跳过了问题的“匿名”部分。然后就不能了,只有方法才能有隐式参数