标签:fine sde cti rac lse err new match ase
问题1: 抽象成员初始化规则
① 父类先初始化
② 在初始化的过程中,如果 val 发生重写,只有最后一个重写生效。前面的会变成零值,后面的会直接继承。
参考资料:https://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
示例:
abstract class A { val x1: String val x2: String = "mom" println("A: " + x1 + ", " + x2) } class B extends A { val x1: String = "hello" println("B: " + x1 + ", " + x2) } class C extends B { override val x2: String = "dad" println("C: " + x1 + ", " + x2) } new C
输出:
A: null, null B: hello, null C: hello, dad
解析:
当一个 val 被重写时,只能初始化一次。例如,x2 在 B处初始化了,并且在 C处也初始化了,只有C处的生效。
如果 x2 同时在 B、C 两处初始化,打印的结果是
A: null, null B: hello, null C: hello, dad
如果 x2 仅在B处初始化则,打印的结果是
A: null, null B: hello, dad C: hello, dad
如果 x2不发生重写,初始值就是默认初始值。打印的结果是
A: null, mom B: hello, mom C: hello, mom
问题2: 偏函数
特性:
单参数的函数
不处理所有可能的输入,只处理那些能与至少一个 case 语句匹配的输入
可以用 isDefineAt 方法测试特定输入是否与偏函数匹配
偏函数之间可以链式连接
val pf1:PartialFunction[Any, String] = {case s:String => "YES"} val pf2:PartialFunction[Any, String] = {case d:Double => "YES"} val pf = pf1 orElse pf2 pf.isDefinedAt("d") // Boolean try { pf("d").toString } catch { case _:MatchError => "ERROR!" }
233
标签:fine sde cti rac lse err new match ase
原文地址:https://www.cnblogs.com/lemos/p/11874343.html