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给出了匹配错误,正如预期的那样.
案例类的伴随对象扩展,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
伴随对象作为函数传递的原因是因为它是一个函数.