问题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!" }

  

问题3:隐含参数

使用可以用最后一个参数列表来推断隐含参数。隐含参数是用 implicit 关键字声明的参数。

当相应方法被调用时,我们可以显式指定这个参数,或者也可以不指定,这时编译器会在当前作用域中找到一个合适的值作为参数。

隐含参数可以代替参数默认值,而且更加灵活。

示例:

import scala.concurrent.ExecutionContext.Implicits.global

def sleep(millis: Long): Unit = {
Thread.sleep(millis)
} // Busy work ;)
def doWork(index: Int) = {
sleep((math.random * 1000).toLong)
index
} (1 to 5) foreach { index =>
val future = Future {
doWork(index)
}
//定义事件回调。该方法接受两个参数列表。(pf: PartialFunction[T, U])(implicit executor: ExecutionContext)
future onSuccess {
case answer: Int => println(s"Success! returned: $answer")
}
future onFailure {
case th: Throwable => println(s"FAILURE! returned: $th")
}
} sleep(1000) // Wait long enough for the "work" to finish.
println("Finito!")

  

233

scala 基础知识 FAQ的更多相关文章

  1. scala 基础知识总结

    在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...

  2. Scala基础知识[一]

    摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...

  3. SCALA基础知识学习

    注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...

  4. Scala基础知识笔记1

    上一篇文章介绍了如何下载scala, 因为在官网上点击下载按钮无法下载, 下面介绍scala的基础语法: 1 scala和java的关系 Scala是基于jvm的一门编程语言,Scala的代码最终会经 ...

  5. (数据科学学习手札45)Scala基础知识

    一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...

  6. [Scala] Scala基础知识

    Object An object is a type of class that can have no more than one instance, known in object-oriente ...

  7. 为Play初学者准备的Scala基础知识

    1 前言 本文的主要目的是为了让Play Framework的初学者快速了解Scala语言,算是一篇Play Framework的入门前传吧.使用PlayFramework可以极大的提高开发效率,但是 ...

  8. 【转】Scala基础知识

    原文地址.续 课程内容: 关于这节课 表达式 值 函数 类 继承 特质 类型 apply方法 单例对象 函数即对象 包 模式匹配 样本类 try-catch-finally 关于这节课 最初的几个星期 ...

  9. Scala基础知识笔记2

    1 类 1.1 定义一个简单的类 1.2 field的getter 和 setter方法 感觉成员变量定义成  var 属性名=属性值即可,  不需要定义成 val 或者 private就行, // ...

随机推荐

  1. 【LeetCode】删除链表的倒数第N个节点【双指针法】

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  2. docker深入学习二

    dicker:数据管理 数据管理机制 docker使用union file system来管理数据,docker构建image和container也是采用了同样的技术. image层次 iamge由多 ...

  3. 【LEETCODE】40、1051. Height Checker

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  4. 如何配置php session使用redis集群

    本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...

  5. 终于明白六大类UML类图关系了

    UML,全称Unified Modeling Language,统一建模语言.而UML图分为用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等9种图. 在面向对象语言中,我们经常看 ...

  6. VirtualBox安装文档教程

    1找到安装包双击打开 2 3 这里可以更改安装路径 4 5 6 7 等待安装 8

  7. Matlab 多项式及其函数

    多项式及其函数 多项式及其函数 Matlab用一维向量表示多项式 例:创建一个通用的一维向量转化为字符串格式的表达式 function s = pprintf(p) %pprintf 该函数可将一维向 ...

  8. mysql开启二进制日志

    打开xhell进入系统 进入mysql配置文件目录 执行 cd /etc/mysql 首先找到my.cnf这个配置文件,然后使用vim进入文件编辑 放开我标记的地方. 注意我标记的地方,其实这个就是在 ...

  9. Http 请求头包含哪些信息?

    协议头 说明 示例 状态 Accept 可接受的响应内容类型(Content-Types). Accept: text/plain 固定 Accept-Charset 可接受的字符集 Accept-C ...

  10. Switch开关在element-ui表格中点击没有效果解决方法

    <el-table-column label="三审" align="center"> <template slot-scope=" ...