簡體   English   中英

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隱含的參數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()

(但說實話,這聽起來好像可以寫得更好,而且你正在進行意大利面條代碼領域與你正在做的事情。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM