为什么Scala函数接受函数参数的case类类型?

Ami*_*shi 1 functional-programming scala

考虑代码块.

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)
Run Code Online (Sandbox Code Playgroud)

为什么Dept可以作为Funtion1类型传递?是这样,Scala在解析参数之前不会检查类型.

考虑其他代码段

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

matchingCase((x: String)=> Dept(x))
Run Code Online (Sandbox Code Playgroud)

而在上面的代码中scala给出了匹配错误,正如预期的那样.

Jör*_*tag 5

案例类的伴随对象扩展,FunctionX[T1, T2, <CaseClass>]以便您可以使用它来构造案例类的实例.

所以,例如,如果你有一个案例类

case class Foo(i: Int, s: String)
Run Code Online (Sandbox Code Playgroud)

编译器将生成一个伴随对象

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
}
Run Code Online (Sandbox Code Playgroud)

这允许您构造一个这样的实例Foo:

Foo(42, "Hello")
Run Code Online (Sandbox Code Playgroud)

代替

new Foo(42, "Hello")
Run Code Online (Sandbox Code Playgroud)

因此,总结一下:为什么你可以将Dept伴随对象作为函数传递的原因是因为它一个函数.