宣告變數,Java 使用的格式是
var_name: type;
記得分號 「;」 是 Java statement 的分隔符號,不可省略。
例:
n1: int;
在 Scala 中宣告一個變數,格式為
var var_name: type;
var 是 Scala 的 keyword,表示要開始宣告變數,後面接變數名稱,再接 type。type 後面的分號,可以省略。
例:
var n1: Int = 10
Scala 在這裡有許多與 Java 不同的地方:
A.分號:
在 Scala 中,為符合快速開發的原則,可以省略的,都省略了,所以10後面的分號是可以省略的。省略分號的原則,四處都適用,但你若不喜歡省略,也是可以繼續使用。
B.初始值:
在 Java 變數的宣告,初始值是可有可無的,這可分為兩種狀況:
1. 當宣告的變數是 method 裡面的 local variable 時,Java 不會強迫你一定要指定初始值。但若你尚未指定值,就使用到該變數,compiler 不會允許這種情況,會在你使用該 variable 的地方產生 error,要求你在變數被使用之前設定該變數值。
2. 當宣告的變數是 class 中的 data field 時,每個 data field 都需要有初始值。只是你若沒有特別指定,javac 會幫你加上 default 的初始值,這些初始值如下:
- 數值型態的初始值為 0 或 0.0
- 布林型態的初始值為 false
- Reference型態(在Java中所有的 object 都是 Reference 型態)為 null
所謂的預定初始值,是使用系統預定的初始值,這有點像 Java 對待 class 中的 data field 一樣。但在 Scala 中,你可要講清楚要使用系統預定的初始值,作法如下:
var n1: Int = _ var s1: String = _
那個 underscore _ 是 Scala 的「預定萬用字元」,代表的意思就是那個「預定的東西」。
這個預定萬用字元在 Scala 運用的範圍非常廣泛,你以後會很容易看到,我們在其他遇到的地方適時解釋給各位瞭解。
預定萬用字元使用在初始值,所代表的意義就是使用系統的預定值。
系統的預定值依據不同的型態會有不同的預定值,與 Java 類似,數值型態預定值為 0、布林型態預定值為 false、其他的 Reference 型態為 null。(在 Scala中所有的東西都是object,所以這裡特別要說明是 Reference 型態,不可說所有的 object 都會初始為 null)
上述兩個宣告
var n1: Int = _ // 與 var n1: Int = 0 相同意義 var s1: String = _ // 與 var s1: String = null 相同意義
C.var 與 val:變數與常數
在一般的語言中,我們可以看到有兩種變數,一種真正的變數(可以重新設定值),一種是常數(不可重新設定值)。在 Scala 中支援這兩種,變數使用 var 宣告,常數使用 val 宣告,var 是 variable 的縮寫,val 是 value 的縮寫。
1.var
var n1: Int = 102.val
val n1: Int = 10val宣告的常數指定初始值之後,不可以再被重新設定(就算設定的值一模一樣也不可以)。
Scala 宣告 val 的常數,被 compile 出來之後就是一個加上 final modifier 的 variable,也就是在任何地方,該變數都不可再被重新設定值,不論你使用 Scala 或 Java 來存取該常數。
D. 型態推論
型態推論簡單講是,由於 compiler 可以判斷等號的右邊是一個 Int 型態,所以 n1 沒有特別指明哪個型態時,就由 compiler 來自行做型態的推論。型態推論是一個重要的觀念,我們將在以後篇幅中討論。
var n1 = 10以上例而言,n1 被指定為 Int 型態。
Scala 最嚴謹的變數宣告是「變數名稱加型態名稱,後面再加上初始值」,但由於分號省略與型態推論,所以可將變數宣告寫的更精簡
如:
var n1: Int = 10;
1.分號省略:可以變為
var n1: Int = 10
2.型態推論(Type Inference):可以變為
var n1 = 10
「var n1 = 10」 這種宣告方式,反而是最常見的變數宣告方式。
重新設定值:變數宣告完後,你可以重新給它新的值,此時的用法與 Java一模一樣,但 val 常數不可以在重新 assign 值。
var n = 10 //宣告變數,並給初值 n = 20 // 重新 assign 新的值請注意:n = 20 這個 assignment 的 result value 是 unit value(unit value 以後會討論,現在先把 unit value 看成沒有值),不是 20 這個值。
沒有留言:
張貼留言