簡體   English   中英

為什么Scala函數接受函數參數的大小寫類類型?

[英]why does Scala function accepts case class type for a function argument?

考慮代碼塊。

class Evaluation {
  def evaluate= {
    println("Charlie...")
  }
}
case class Dept(name:String) extends Evaluation

def depEval(name:String,f:(String) => Evaluation) ={
  println(name)
  f(name).evaluate
}
depEval("abc", Dept)

為什么Dept可以作為Funtion1類型傳遞? 就是這樣,Scala不會在解析參數之前檢查類型。

考慮其他片段

def matchingCase(f: String => Evaluation)= {
  println(f.toString())
  f match {
    case Dept => println("function type matched")
  }
}

matchingCase((x: String)=> Dept(x))

而在上面的代碼中,scala給出了匹配錯誤,正如預期的那樣。

案例類的伴隨對象擴展了FunctionX[T1, T2, <CaseClass>]因此您可以使用它來構造案例類的實例。

因此,例如,如果您有案例類

case class Foo(i: Int, s: String)

編譯器將生成一個伴隨對象

object Foo extends (Int, String) ⇒ Foo with Product2[Int, String] {
  def apply(i: Int, s: String) = new Foo(i, s)

  // and some other stuff such as equals, hashCode, copy
}

這使您可以像下面這樣構造Foo的實例:

Foo(42, "Hello")

代替

new Foo(42, "Hello")

因此,可以得出結論:之所以可以將Dept隨行對象作為函數傳遞,是因為它一個函數。

Dept不是“案例類類型”,它是案例類的伴侶object 它擴展了Function1 (並具有.apply方法,這是接口的一部分),因此您可以在需要函數的任何地方使用它。

第二個失敗的原因是{ x => Dept(x) }是它自己的匿名函數,而不是Dept對象。

這很有道理,因為如果您只是給Dept做為paramenter,它將表現為一個以String為參數的ass函數,並返回Dept類的實例,這意味着一個Dept對象(就像給new或apply函數作為參數),請注意以下代碼也有效:

val c: Dept.type = Dept

val dep = c("Name1")

dep

res1:部門=部門(Name1)

dep.evaluate

查理... res2:單位=()

暫無
暫無

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

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