Michelle Chen [Groovy] 程式設計教學:使用變數 (Variable)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

說明

電腦程式很大一部分是在操作各種資料 (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