Scala入门指南
Scala解釋器
啟動Scala解釋器的步驟如下:
●安裝Scala。
●確保scala/bin目錄位于系統PATH中。
●在你的操作系統中打開命令行窗口。
●鍵入scala并按Enter鍵。
提示:不喜歡命令行?你也可以通過其他方式運行Scala解釋器,參見 http://horstmann.com/scala/install。
現在,鍵入命令,然后按Enter鍵。每一次,解釋器都會顯示出結果。例如,當你鍵入“8 * 5 + 2”(如下面加粗的文字),將得到42。
scala> 8 * 5 + 2
res0: Int = 42
答案被命名為res0,你可以在后續操作中使用這個名稱:
scala> 0.5 * res0
res1: Double = 21.0
scala> "Hello," + res0
res2: java.lang.String = Hello, 42
正如你所看到的,解釋器同時還會顯示結果的類型——拿本例來說就是Int、Double和java.lang.String。
你可以調用方法。根據啟動解釋器的方式的不同,你可能可以使用Tab鍵補全而不用完整地手工鍵入方法名。你可以試著鍵入res2.to,然后按Tab鍵,如果解釋器給出了如下選項:
toCharArray toLowerCase toString toUpperCase
說明Tab鍵補全功能是好的。接下來鍵入U并再次按Tab鍵,你應該就能定位到單條補全如下:
res2.toUpperCase
按下Enter鍵,結果就會被顯示出來。(如果在你的環境中無法使用Tab鍵補全,那你就只好自行鍵入完整的方法名了。)
同樣地,可以試試按↑和↓方向鍵。在大多數實現當中,你將看到之前提交過的命令,并且可以進行編輯。用←、→和Del鍵將上一條命令修改為:
res2.toLowerCase
正如你所看到的,Scala解釋器讀到一個表達式,對它進行求值,將它打印出來,接著再繼續讀下一個表達式。這個過程被稱做讀取-求值-打印-循環,即REPL。
從技術上講,scala程序并不是一個解釋器。實際發生的是,你輸入的內容被快速地編譯成字節碼,然后這段字節碼交由Java虛擬機執行。正因如此,大多數Scala程序員更傾向于將它稱做“REPL”。
提示:REPL是你的朋友。即時反饋鼓勵我們嘗試新的東西;而且,如果它跑出你想要的效果,你會很有成就感。
同時,打開一個編輯器窗口也是個不錯的主意,這樣你就可以將成功運行的代碼片段復制、粘貼出來供今后使用。同樣地,當你嘗試更復雜的示例時,你也許會想要在編輯器中組織好以后再貼到REPL。
聲明值和變量
除了直接使用res0、res1等這些名稱之外,你也可以定義自己的名稱:
scala> val answer = 8 * 5 + 2
answer: Int = 42
你可以在后續表達式中使用這些名稱:
scala> 0.5 * answer
res3: Double = 21.0
以val定義的值實際上是一個常量——你無法改變它的內容:
scala> answer = 0
<console>:6: error: reassignment to val
如果要聲明其值可變的變量,可以用var:
var counter = 0
counter = 1 // OK,我們可以改變一個var
在Scala中,我們鼓勵你使用val——除非你真的需要改變它的內容。Java或C++程序員也許會感到有些意外的是,大多數程序并不需要那么多var變量。
注意,你不需要給出值或者變量的類型,這個信息可以從你用來初始化它的表達式推斷出來。(聲明值或變量但不做初始化會報錯。)
不過,在必要的時候,你也可以指定類型。例如:
val greeting: String = null
val greeting: Any = "Hello"
說明:在Scala中,變量或函數的類型總是寫在變量或函數名稱的后面。這使得我們更容易閱讀那些復雜類型的聲明。
當我在Scala和Java之間來回切換的時候,我發現我經常無意識地敲出Java方式的聲明,比如String greeting,需要手工改成greeting: String。這有些煩人,但每當我面對復雜的Scala程序時,我都會心存感激,因為我不需要再去解讀那些C風格的類型聲明。
說明:你可能已經注意到,在變量聲明或賦值語句之后,我們并沒有使用分號。在Scala中,僅當同一行代碼中存在多條語句時才需要用分號隔開。
你可以將多個值或變量放在一起聲明:
val xmax, ymax = 100 // 將xmax和ymax設為100
var greeting, message: String = null
// greeting和message都是字符串,被初始化為null
常用類型
到目前為止你已經看到過Scala數據類型中的一些,比如Int和Double。和Java一樣,Scala也有7種數值類型:Byte、Char、Short、Int、Long、Float和Double,以及1個Boolean類型。跟Java不同的是,這些類型是類。Scala并不刻意區分基本類型和引用類型。你可以對數字執行方法,例如:
1.toString() // 產出字符串"1"
或者,更有意思的是,你可以:
1.to(10) // 產出Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(我們將在第13章介紹Range類,現在你只需要把它當做一組數字就好。)
在Scala中,我們不需要包裝類型。在基本類型和包裝類型之間的轉換是Scala編譯器的工作。舉例來說,如果你創建一個Int的數組,最終在虛擬機中得到的是一個int[]數組。
正如你在1.1節中看到的那樣,Scala用底層的java.lang.String類來表示字符串。不過,它通過StringOps類給字符串追加了上百種操作。
舉例來說,intersect方法輸出兩個字符串共通的一組字符:
"Hello".intersect("World") // 輸出"lo"
在這個表達式中,java.lang.String對象"Hello"被隱式地轉換成了一個StringOps對象,接著StringOps類的intersect方法被應用。
因此,在使用Scala文檔的時候,記得要看一下StringOps類。
同樣地,Scala還提供了RichInt、RichDouble、RichChar等。它們分別提供了它們可憐的堂兄弟們——Int、Double、Char等——所不具備的便捷方法。我們前面用到的to方法事實上就是RichInt類中的方法。在表達式
1.to(10)
中,Int值1首先被轉換成RichInt,然后再應用to方法。
最后,還有BigInt和BigDecimal類,用于任意大小(但有窮)的數字。這些類背后分別對應的是java.math.BigInteger和java.math.BigDecimal,不過,在1.4節你會看到,它們用起來更加方便,你可以用常規的數學操作符來操作它們。
說明:在Scala中,我們用方法,而不是強制類型轉換,來做數值類型之間的轉換。舉例來說,99.44.toInt得到99,99.toChar得到'c'。當然,和Java一樣,toString將任意的對象轉換成字符串。
要將包含了數字的字符串轉換成數值,使用toInt或toDouble。例如,"99.44".toDouble得到99.44。
?
本文節選自《快學Scala》
電子工業出版社出版
(美)霍斯曼(Horstmann,C.S.)著
高宇翔譯轉載于:https://blog.51cto.com/bvbroadview/1040574
總結
- 上一篇: X86/ARM 模拟器
- 下一篇: svchost.exe介绍