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+源代码

Powershell 教程学习资源汇总

深入理解Flask_(美)Jack Stouffer著 PDF

C#.NET书籍

《实用电子元器件与电路基础》 原书中文第3版+第2版+英文第4版等5本书 (美)舍茨(美)莫克著

送书|高性能Scala,武装你的知识储备