Scala 学习手册/(美)Swartz,J. 著
Posted Life4Learning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala 学习手册/(美)Swartz,J. 著相关的知识,希望对你有一定的参考价值。
书名:Scala 学习手册/(美)Swartz,J. 著;苏金国等译。--北京:中国电力出版社,2016.2
## 第1章 概述
1. 输出:`println("hello world!")`,`String` 字符为双引号,`Char` 字符为单引号
2. REPL:Read,Evaluate,Print,Loop.可以跨会话存储
3. up 箭头:上一行命令
4. 每一行的输出`result`REPL 会用一个常量变量保存:`res0,res1,...`
5. 运行`scala`文件`hello.scala`
1. 交互环境中输入 `scala> :load hello.scala`
2. 命令行:`scala hello.scala`
6. 退出:`:q`
## 第2章 数据类型(数值类型:`Int,Double`,非数值类型:`String,Char`)
1. Scala 值(不可重新赋值):`scala> val x:Int=10`,不可变有类型的存储文件,用关键字`val`(value),类型可省略`scala> val x = 10`
2. 变量:`scala> var a:Double=2.73`,关键字`var`(variable),类型可省略`scala> var a=2.73`
3. 字符串
```
val approx = 355/113f
println("Pi,using 355/113,is about "+approx+".")
println(s"Pi,using 355/113,is about $approx.") //内插法
```
4. 字符串内插(替代格式`printf`,难读,输出可格式化)
```
val item = "apple"
println(s"How do you like them ${item}s?")
println(s"Fish n chips n ,${"pepper "*3}salt") // 字符串乘法
println(f"I wrote a new $item%.3s today")
println(f"Pi,using 355/113,is about ${355/113.0}%.5f.") //内插法
```
5. 正则表达式
```
"Froggy went a' courting" matches ".* courting" //Ture or False
"milk,tea,muck" replaceAll ("m[^ ]+k","coffee")
"milk,tea,muck" replaceAll ("m[^ ].k","coffee")
"milk,tea,muck" replaceFirst ("m[^ ]+k","coffee")
"milk,tea,muck" replaceFirst ("m[^ ].k","coffee")
// 捕获组:小括号定义,输入至少包括一个匹配值
val input = "Enjoy this apple 3.14159 times today"
val pattern = """.* apple ([\d.]+) times .*""".r // r 为字符串操作符
val pattern(amountText) = input
val amount = amountText.toDouble
```
6. 类型操作(每个类型都属于一个对象)
1. `scala> 5.asInstanceOf[Double]`:val/var 类型转换(尽量用第五条)
2. `scala> nada.getClass`:val/var 查看类型
3. val/var 类型确认:`scala> nada.isInstanceOf[Unit]`
4. val/var 散列码: `scala> "A".hashCode`
5. val/var 转换函数:`toString/toByte/toFloat/...`
7. 元组:包含两个以上值得有序容器,值类型可不同,不可迭代但可通过下标访问。类似关系型数据库中得一行
```
// 元组,下标从1开始
val info = (5,"Korben",true)
val name = info._2
val red = "red"->"0xff0000" // 利用关系操作符创建2元组
val reversed = red._2 -> red._1
```
**注:**
1. 值优先于变量,因为值可以为代码带来稳定性和可预测性。
2. 类型为Double 的变量可以赋 Int 值,因为Int数可以自动转换为Double 数。
3. 变量命名建议:`camel case`驼峰命名
4. 字符串支持三重双引号
5. Scala 不支持其他类型到Boolean 的自动转换,非Null 字符不会计算为True,0也不等于False
6. &&与||很懒,第一个参数可以出结论,不在计算第二个参数。&与| 会对两个参数都做检查
7. Unit 字面量:`scala> val nada=()`,通常用来定义函数和表达式
## 第3章 表达式 和 条件式
### 表达式
1. 表达式:`scala> val x=5*20;val amount = x+10`,字面量val/var 也是一种表达式
2. 表达式块:`scala> val amount = {val x=5*20;x+10}`块中最后一个表达式最为块得返回值。
1. 表达式块分号,可用换行替代
2. 表达式块可以嵌套`scala> {val a=1;{val b=a*2;{val c=b+4;c}}}`
3. if...else 表达式块:`scala> val max = if(5>3) {val x=4*2;x+2} else 2`
4. 匹配表达式(`match expressions`):类似 switch
```
// 匹配表达式
val status=500
val message = status match {
case 200 => "ok"
case 400 => println("ERROR - we called the service incorrectly");"error"
case 500 => {
println("ERROR - the service encountered an error");"error"
}
}
// 模式替换式 pattern alternative
val day = "MON"
val kind = day match {
case "MON"|"tue"|"wed"|"thu"|"fri" => "weekday"
case "sat"|"sun" => "weekend"
}
```
5. 通配模式匹配
```
//值绑定
val message="ok"
val status = message match {
case "ok" => 200
case other => println(s"could not parse $other");-1
}//other 为case 块定义,并赋值为 message
//通配符
val message="Tom"
val status = message match {
case "ok" => 200
case _ => println(s"could not parse $message");-1
}//_ 通配符,可以匹配任意值,右侧不可访问.若需要访问,可直接访问输入
```
6. 模式哨卫匹配(case 后面 + if 表达式,可不加括号)
```
val response:String ="ok1"
response match {
case s if s!= null => println(s"Received '$s'")
case s => println("ERROR! Received a null response")
}
```
7. 模式变量匹配类型(应该不常用)
### 循环(表达式的控制结构)
1. for 循环`<-`类似python 中的 `in`
```
for (x <- 1 to 7 by 1) {println(s"Day $x")}
println(s"${"*"*3}等价于${"*"*3}")
val week = for (x <- 1 until 8 by 1) yield {s"Day $x:"} //返回值将作为一个集合返回,可迭代
for (day <- week) print(day+",") // print 不换行
```
2. 迭代器哨卫(`iterator guard/filter`,增加一个 if表达式)
```
val threes = for(i<-1 to 20 if i%3==0) yield i
val quote = "Faith,Hope,,Charity,null"
for {t<-quote.split(",");if t!=null;if t.size>0}{println(t)} //迭代器与迭代器哨卫 分开
```
3. 嵌套迭代器(多层循环):`scala> for {x<-1 to 2;y<-3 to 5}{print(s"($x,$y)")}`
4. 值绑定 for 循环:`val powersOf2 = for (i<-0 to 8;pow=1<<i) yield pow // 1 左移 i 位`
5. while/do...while... 循环
1. while:`scala> var x=10;while (x>=0) x -= 1`
2. do...while:`val x=0;do println(s"Here I am,x=$x") while (x>0)`
以上是关于Scala 学习手册/(美)Swartz,J. 著的主要内容,如果未能解决你的问题,请参考以下文章
分享《神经网络与深度学习(美)Michael Nielsen 著》中文版PDF+英文版PDF+源代码
深入理解Flask_(美)Jack Stouffer著 PDF