Scala:如何用隐式参数定义匿名函数?

bar*_*ara 3 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
Run Code Online (Sandbox Code Playgroud)

但是我的Scala编译器没有编译它.它说:Cannot resolve reference apply with such signature.但是,参数是隐式的,所以我猜编译器应该在范围内查找并找到一个合适的对象.

这是真的吗?如果没有,那么我该如何解决呢?

Gio*_*tti 7

你不能.只有方法可以有隐式参数.

当你这样做:

// val f: A => Unit = 
{
   implicit a: A => {
     // some action
   }
}
Run Code Online (Sandbox Code Playgroud)

你实际上是在声明一个类型的匿名函数,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()
}
Run Code Online (Sandbox Code Playgroud)

你会得到一个弃用警告,因为磁铁必须至少有一个参数我用过Unit,你应该称之为.apply(())避免它