2011年4月23日 星期六

3-3. 變數宣告與重新設定值

Scala 與 Java 相同,都是強型態的語言,而且沒有宣告變數,不能使用該變數。

宣告變數,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
Scala 中變數的宣告,初始值是必須要的,不管是  local variable 或是 data field,每個變數宣告一定要設定初始值。但你若懶得直接寫值,Scala 也支援使用預定初始值。

所謂的預定初始值,是使用系統預定的初始值,這有點像 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 = 10
2.val
val n1: Int = 10
val宣告的常數指定初始值之後,不可以再被重新設定(就算設定的值一模一樣也不可以)。

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 這個值。

沒有留言:

張貼留言