說明
電腦程式很大一部分是在操作各種資料 (data),而變數 (variable) 是電腦程式用來操作資料的語法特性。在本文中,我們會學到 Groovy 程式如何使用變數。
在撰寫程式時,我們會將資料以識別字 (identifier) 來命名,在後續的程式中可呼叫該識別字來使用資料。
在電腦程式中,程式調用的資料會存在記憶體中,變數相當於指向資料的標籤。但我們平常在寫程式時不需了解這些電腦程式內部運作的技術細節,只要把變數當成一項特性來使用即可。
宣告和使用變數
我們以一個簡單的例子來看變數的使用:
/* Declare the variable name, assigning a string to it. */
def name = "Michelle"
/* Call the variable, printing it out. */
println "Hello ${name}"
def
是 Groovy 的保留字 (keyword),用來宣告變數。除了 Groovy 原有的 def
外,也可以用 Java 10 新增的 var
來宣告變數。
首先,我們宣告一個變數 name
,這時候 name
就成為程式的識別字。我們在宣告變數的同時指派一個字串實字 "Michelle"
給 name
。接著,我們在後續的指令中呼叫此變數,將其印到終端機上。
變數的資料型態可變動
由於 Groovy 是動態型態語言,變數的型態可自由改變。見下例:
/* var is an integer */
def var = 100
assert var == 100
assert var instanceof java.lang.Integer
/* var is a string now */
var = "Michelle"
assert var == "Michelle"
assert var instanceof java.lang.String
在這個範例中,一開始變數 var
是整數,其值為 100
,後來,var
的型態變為字串,其值為 "Michelle"
。
在我們的程式中,我們用斷言 (assertion) 代替 println,因為這樣可以在閱讀程式碼時就知道程式的意圖,而且可由電腦程式自動確認程式的狀態正確與否。近年來的程式設計教材有用斷言取代輸出終端機的傾向,我們之後大部分程式碼也會用這種風格。
在本例中,透過 instanceof
可以得到變數 var
的類別 (class),在此處就是資料型態 (data type)。
為變數加上資料型態標註
除了使用動態型態,我們也可以在程式中標註型態的資訊。見下例:
/* `var` is an integer */
int var = 100
assert var == 100
assert var.class == java.lang.Integer
這時候,變數就有特定的型態,若更動型態會造成程式的錯誤,見下例:
/* `var` is an integer */
int var = 100
assert var == 100
assert var instanceof java.lang.Integer
/* Error! */
var = "Michelle"
這是因為變數 var
已經綁定特定的型態。在 Groovy,型態標註是選擇性的 (optional),程式設計者可視需求自行決定是否要加入型態。通常,如果想要在程式中限定變數的類型時,就會加上,反之則不加。
命名識別字 (Identifier)
識別字可用於變數、函式、方法、類別等。以下是命名識別字的方式:
- 首字使用英文字母或底線
- 之後使用英文字母、數字、底線
按照 Java 社群的慣例,使用以下風格來命名識別字:
- 類別使用
PascalCase
(大駝峰命名法) - 變數、函式、方法使用
camelCase
(小駝峰命名法) - 不使用
snake_case
變數的可視域 (Scope)
作用域是變數的有效範圍。控制變數的作用域可避免不當修改。
Groovy 的變數可視域基於區塊 (block)。在以下的例子中,變數 v
超出區塊後消失,無法再存取:
/* Create a block. */
{
/* Create a local variable */
def v = 9999
}
/* Error! */
assert 9999 == v
for
迴圈的計數器也是一個小區塊。在 for
迴圈外無法存取:
/* Run a dummy loop 10 times. */
for (def i = 1; i <= 10; ++i) {}
/* Error! */
assert 10 == i