chapter 1 scala基礎
標籤:快學scala
《快學scala》原書《scala for the Impatient》
一、筆記
- 技術上講,scala程序並不是一個解釋器。實際發生的是,輸入的內容被編譯成字節碼,然後字節碼交由Java虛擬機執行。
不需要給出值或變量的類型,這個信息可以從你用來初始化它的表達式推斷出來。但是,聲明值和變量一定要初始化。 - 變量和函數的類型總是在變量和函數名稱後面,也不用使用分號,只有當同一行代碼存在多條語句時才需要‘;’
val greeting: String = null
val greeting: Any = "Hello"
scala中Byte、Char、Short、Int、Long、Float、Double和Boolean這些類型都是類。scala並不刻意區分基本類型和引用類型。比如
1.toString() //產生字符串“1”
1.to(10) //產生Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),Int先轉換成RichInt,再調用to方法
- scala中無需包裝類型,這是scala編譯器的工作。Int數組在虛擬機中就是int[]數組。
scala> "Hello".intersect("world")
res13: String = lo //輸出共通的一組字符
其中java.lang.String對象"Hello"被隱式轉換成一個StringOps對象,然後StringOps類調用intersect方法。
說明:scala中我們用方法,而不是強制類型轉換,來做數值類型之間的轉換。
4. scala運算符實際上是方法。
a+b 其實是 a.+(b)的簡寫。
scala中不存在++/--操作符。因爲無法簡單的實現一個名爲++的方法。數學函數調用更爲簡單:
scala> import scala.math._
import scala.math._ //引入包,‘_’爲通配符
scala> pow(2,4)
res24: Double = 16.0
scala> sqrt(2) //等同於math.sqrt(2)
res25: Double = 1.4142135623730951
scala> min(3,Pi)
res27: Double = 3.0
- apply方法
StringOps類中有一個方法:
def apply(n: Int) : Char 也就是說:
"Hello"(4) 是 "Hello".apply(4) 的簡寫。 - scaladoc
http://www.scala-lang.org/api
二、習題答案
1.2 在Scala REPL中,計算3的平方根,然後再對該值求平方。現在,這個結果與3相差多少?(提示:res變量是你的朋友)
scala> import math._
import math._
scala> sqrt(3)
res4: Double = 1.7320508075688772
scala> res4 * res4
res5: Double = 2.9999999999999996
scala> 3 - res5
res6: Double = 4.440892098500626E-16
1.3 res變量是val還是var?
res變量是val
1.4 Scala允許你用數字去乘字符串—去REPL中試一下”crazy”*3。這個操作做什麼?在Scaladoc中如何找到這個操作?
scala> "crazy" *3
res7: String = crazycrazycrazy
http://www.scala-lang.org/api/current/#scala.collection.immutable.StringOps
1.5 10 max 2的含義是什麼?max方法定義在哪個類中?
scala> 10 max 2
res8: Int = 10 //返回比較大的數
http://www.scala-lang.org/api/current/#scala.runtime.RichInt
1.6 用BigInt計算2的1024次方
scala> BigInt(2).pow(1024)
res11: scala.math.BigInt = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
1.7 爲了在使用probablePrime(100,Random)獲取隨機素數時不在probablePrime和Radom之前使用任何限定符,你需要引入什麼?
Random在scala.util中,而probablePrime是BigInt中的方法.
scala> import scala.math.BigInt._
import scala.math.BigInt._
scala> import scala.util.Random
import scala.util.Random
scala> probablePrime(100,Random)
res12: scala.math.BigInt = 766635143018327231452301029633
1.8 創建隨機文件的方式之一是生成一個隨機的BigInt,然後將它轉換成三十六進制,輸出類似”qsnvbevtomcj38o06kul”這樣的字符串。查閱Scaladoc,找到在Scala中實現該邏輯的辦法。
scala> scala.math.BigInt(scala.util.Random.nextInt).toString(36)
res2: String = -6ihoyw
1.9 在Scala中如何獲取字符串的首字符和尾字符?
scala> "Hello"(0)
res3: Char = H
scala> "Hello".reverse(0)
res4: Char = o
scala> "Hello".takeRight(1)
res6: String = o
1.10 take,drop,takeRight和dropRight這些字符串函數是做什麼用的?和substring相比,他們的優點和缺點都是哪些?
scala> "Hello world".take(2)
res7: String = He
scala> "Hello world".drop(2)
res8: String = llo world
scala> "Hello world".takeRight(2)
res9: String = ld
scala> "Hello world".dropRight(2)
res10: String = Hello wor
scala> "Hello world".substring(2)
res12: String = llo world
scala> "Hello world".substring(2, 6)
res17: String = "llo "
take,drop,takeRight,dropRight適合從兩邊處理字符串,substring適合處理中間的字符串。