Scala Tutorial(2)準備開發環境、Scala 中的四則運算
Scala Tutorial(1)靜態型別也可以很方便 << 前情 安裝 Java 與 Scala由於 Scala 不論是編譯與執行,均是運行在 Java 虛擬機器上,因此在安裝 Scala 之前,必須先安裝 Java 執行環境,才能讓 Scala 正確執行。 目前執行 Scala 的需求是 Java 1.6 以上,但使用最 1.7 或 1.8 版本的 Java 也可以正常執行,讀者可以直接到 Java 網站下載最新的 Java 執行環境。 以 Windows 為例,進入 Java 官方網站後,點擊「免費 Java 下載」的按鈕,就可以下載 Java 的安裝程式,安裝的過程相當簡單,只需要在安裝程式執行後點選「安裝」按鈕即可。 在 Java 安裝完成之後,我們還需要將 Java 的可執行檔路徑加到 Windows 系統的
若不確定 Java 的安裝路徑,可以將以上兩個路徑複製到檔案管理員中,正確的路徑應該可以看到 確認過 Java 執行檔路徑後,可以依照下述方式將其加入 Windows 系統的
安裝完 Java 之後,接下來進入 Scala 的下載頁面,並點選第一個 Scala 2.11.1 的 Donwload 按鈕,會開始下載 Scala 的安裝程式,執行後只需要照著螢幕上的指示並安裝即可。[註1] 同樣的,在安裝完後我們必須先確定 Scala 的執行檔必需在 Windows 系統的 確定 Scala 的路徑被加入 給 Scala 使用的 IDE雖然在這份教程中不會使用到 IDE,但在這裡列出目前已經有的 Scala IDE 供讀者參考,這些 IDE 多數是建構在現有的其他 IDE 程式上的插件,因此若讀者已經有慣用的 IDE,亦可以嚐試使用這些 IDE 來撰寫 Scala 程式。
萬物皆是物件進入 Scala 的 REPL 系統後,我們可以看到 首先我們先執行第一道運算式,在 Scala REPL 中輸入 scala> 1 + 1 res0: Int = 2 在這裡,Scala REPL 會替每一個運算式執行後的結果賦與一個暫時的變數名稱,我們可以在後續的運算式中使用這個名稱來存取這個運算式的返回值,而不需要重新輸入同樣的運算式。在這個例子中該變數的名稱為 與 Java 不同的是,雖然在這裡 由於 + 號只是定義在 Int 上的方法,所以我們可以用和 Java 同樣的語法來呼叫這個方法: scala> (1).+(1) res1: Int = 2 在這裡,Scala 只是單純的把 舉例來說,我們已經知道 Java 的字串物件中有一個 scala> "Hello World".charAt(3) res2: Char = l scala> "Hello World" charAt 3 res3: Char = l 同樣的,由於在 Scala 中 Int 也是物件,所以也定義了其他的方法,我們可以輸入 scala> 1. % & * + - / > >= >> >>> ^ asInstanceOf isInstanceOf toByte toChar toDouble toFloat toInt toLong toShort toString unary_+ unary_- unary_~ | 若要更進一步察看每個方法可以傳入什麼樣的參數,我們可以輸入該方法名稱後再按兩下 TAB 鍵,就會出現該方法的函式宣告,告知使用者其接受的參數型別與返回值的型別。 scala> 1.+ def +(x: Byte): Int def +(x: Char): Int def +(x: Double): Double def +(x: Float): Float def +(x: Int): Int def +(x: Long): Long def +(x: Short): Int def +(x: String): String 在這裡我們可以看到,Int 上的加號除了遇到字串會返回另一個字串(符合 Java 中 + 號可以用來建立字串的習慣),其他的情況下都是返回數值型態的值。 這個技巧非常適合用在實驗缺少文件的函式庫上,我們可以使用 Scala REPL 來出函式接受的參數型別與測試其執行的結果而不用撰寫完整的程式碼。 Scala 中運算元的優先權讀者可能會想,如果在 Scala 中所有的運算元都只是函式呼叫,那麼像是四則運算裡先乘除後加減的優先權概念會是如何呢?我們可以先在 Scala REPL 中輸入一個含有不同優先權的四則運算式: scala> 1 + 3 * 5 res1: Int = 16 在這個例子中,我們可以看到確實 但如果 Scala 中所有的運算元都是函式呼叫的話,優先權要如何決定呢?事實上在 Scala 的規格書當中寫道,當我們使用 infix 的方式來呼叫函式時,函式的優先權是依照函式開頭的第一個字元所決定的,依照優先權從低到高如下表所示[註二]: (所有字母) | ^ & < > = ! : + - * / % (所有特殊字元) 在這個表中,我們可以看到以 * 號開頭的函式的優先權比以 + 號開頭的來得高,所以在上述的 相同的,我們知道在 Java 的 String 類別中有 scala> "Hello" contains 'A' && "World" contains 'D' <console>:8: error: value && is not a member of Char "Hello" contains 'A' && "World" contains 'D' 因為以 Scala 對於運算元的優先順序,這個運算式實際上是 (("Hello" contains ('A' && "World")) contains 'D') 也就是說, 若要讓上面這個運算式可以被正確的執行,我們可以和 Java 一樣用括號來調整運算式的優先權,使其可以正確的執行。 scala> ("Hello" contains 'A') && ("World" contains 'D') res4: Boolean = false 最後順帶一提,在該運算元是左結合或右結合方面,Scala 是依靠該函式的最後一個字元所決定的,任何以 小結在這一篇中,我們看到了如何安裝並準備 Scala 的開發環境,如何使用 Scala REPL,還有在 Scala 中運算元其實只是定義在物件上的方法,以及在所有運算元都只不過是方法時,Scala 是如何決定運算元的優先權與左結合或右結合等。 有了這些基礎的認知,下一次開始我們將進入到 Scala 中變數與函式的宣告,並且看 Scala 是如何巧妙地將物件導向與函數式編程給融合在一起。 [註1] 若您的作業系是 Linux 或 MacOS,則只會下載一個壓縮檔而不是安裝程式,只需要解壓縮並將其中的 [註二] 此表摘自 Scala 規格書 2.9 版(2014 年 3 月),但實際上有誤,目前 Scala 編譯器的實作上以 = 號開頭運算元的優先權低於以 < 或 > 開頭的運算元。 |
Aames Jiang
09/02
文末的[後續 >> Scala Tutorial(3)變數與函式] 的 link 是錯的喔