簡體   English   中英

了解函數文字類型

[英]Understanding function literal types

假設此代碼:

  def main(args: Array[String]) {
    val func = (x: String, y :String) => x + ", " + y
    println(myFunc(func))
  }

  def myFunc(f: (String, String) => String) = {
    f("Hey","how are you?")
  }

此代碼的第二行由編譯器替換為:

val func = new Function2[String, String, String] {
             def apply(x: String, y: String): String = x + ", " + y
           } 

我可以推斷出在這種情況下func類型也對應於(String, String) => String)類型,如myFunc簽名所示; 表示Function2[String, String, String](String, String) => String

為什么使用不同的符號? 為什么Scala編譯器沒有將函數文字轉換為某種概念: new ((String, String) => String)而不用Function2[String, String, String]類型煩惱? 或相反亦然。

一種解釋是,類名不能為以下多個部分: (T1, T2) => R 但是為什么不呢?

為什么Scala編譯器沒有將函數文字轉換為某種概念: new (String, String) => String

請記住,Scala會編譯為JVM字節碼。 在JVM中new (String, String) => String沒有諸如“ conceptual new (String, String) => String ”之類的東西。 只有對象和方法(至少在Java 8之前)。 在Java語言中,您必須在Guava和Apache Commons中使用無聊的Callable<T>Runnable或各種Function抽象。 沒有其他辦法了。 從這個角度來看,Scala通過在匿名FunctionX[...]類上添加語法糖來基本上隱藏Java樣板。

這也是當您使用需要函數的方法(所謂的eta擴展 )時,Scala編譯器不得不做很多事情的原因之一。

暫無
暫無

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

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