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

时间:2016-04-23 10:50:56

标签: 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编译器没有编译它。它说:Cannot resolve reference apply with such signature。但是,参数是隐式的,所以我想编译器应该在范围内查找并找到一个合适的对象。

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

2 个答案:

答案 0 :(得分:7)

你做不到。只有方法才能有隐式参数。

执行此操作时:

// 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(())一样调用它来避免它

答案 1 :(得分:2)

Giovanni说:你不能有这样的参数。

但是,您可以使用implicitly来解决函数中的隐含问题:

case class Foo(text : String)
implicit val foo = Foo("World")

(() => {
  val implFoo : Foo = implicitly[Foo]
  println(s"Hello ${implFoo.text}")
}).apply()

(但说实话,这听起来好像可以写得更好,而且你正在进行意大利面条代码领域与你正在做的事情。)