Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:如何使用隐式参数定义匿名函数?_Scala_Implicit Conversion - Fatal编程技术网

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()

(但老实说,这听起来似乎可以写得更好,而且你正在做的事情会让你进入一个意味深长的代码领域。)

你真的不清楚你想要实现什么,至少我想启动一个函数并强制它使用隐式参数。我不想显式地将参数传递给函数。哦,好吧,我明白你的意思,我跳过了问题的“匿名”部分。然后就不能了,只有方法才能有隐式参数