前言
在先前的文章中,我們介紹了變數和資料型別。但是,我們要操作資料,就需要一些基本的指令,透過運算子 (operator),程式設計者可以對資料進行一些基本的操作。
Groovy 的運算子種類較多,但有些運算子需要搭配相關的概念才容易了解。在本文中,我們先介紹一些基本的運算子。
代數運算子 (Arithmetic Operator)
以下是 Groovy 的代數運算子:
- 加
+
- 減
-
- 乘
*
- 除
/
- 取餘數
%
- 取指數
**
- 取正號
+
- 取負號
-
代數運算子的使用方式和基礎代數運算相同。見以下實例:
assert 3 + 2 == 5
assert 3 - 2 == 1
assert 3 * 2 == 6
assert 3 / 2 == 1.5
assert 3 % 2 == 1
assert 3 ** 2 == 9
要注意的是,整數相除若除不盡會得到小數,這和日常生活中的計算方式相同,但和某些程式語言的特性不同。另外,除以零會引發程式錯誤 (error)。
如果要用整數除法,可用整數的 intdiv 函式。參考以下範例:
assert 50.intdiv(15) == 3
這裡也用到前文所提的物件導向語法。
二元運算子 (Bitwise Operator)
二元運算子是用來操作二進位數 (binary number) 的符號。Groovy 提供以下四種二元運算子符號:
- bitwise AND
&
- bitwise OR
|
- bitwise XOR
^
- bitwise NOT
~
以下例子用二元運算子做為旗標 (flag):
final EXEC = 1
final WRITE = 2
final READ = 4
assert READ == 4
assert (READ ^ WRITE) == 6
assert (READ ^ EXEC) == 5
二元運算子一般是用在低階程式,平常較少用到;理論上,使用二元運算會比一般的代數運算快或省資源,但筆者目前無法確認在 Groovy 中是否也是如此。Groovy 不是系統程式語言,保留這項特性僅是保有少數舊有的習慣。
關係運算子 (Relational Operator)
關係運算子用來比較值之間的大小,Groovy 的關係比較運算子會回傳布林值,主要是用在條件句 (conditional) 中,我們將於後文介紹條件判斷。以下是 Groovy 的關係運算子:
- 相等
==
- 不等
!=
- 小於
<
- 小於或等於
<=
- 大於
>
- 大於或等於
>=
實例如下:
assert 3 == 3
assert 3 != 4
assert 3 < 4
assert 3 <= 4
assert 5 > 4
assert 5 >= 4
邏輯運算子 (Logical Operator)
邏輯運算子是用來將兩個或兩個以上的邏輯條件結合,以達成複合的效果。一般程式設計書籍會提供真值表 (true value table),但其實不需要記憶那個表格,只要記得:
- AND (
&&
):兩者皆為真才為真 - OR (
||
):其中之一為真即為真 - NOT (
!
):真變偽,偽變真
以下是實例:
// Logical AND
assert (true && true) == true
assert (true && false) == false
assert (false && true) == false
assert (false && false) == false
// Logical OR
assert (true || true) == true
assert (true || false) == true
assert (false || true) == true
assert (false || false) == false
// Logical NOT
assert !true == false
assert !false == true
三元運算子 (Ternary Operator)
三元運算子是精簡版的條件敘述,代替 if { ... } else { ... }
敘述以取值。實例如下:
def a = 3; def b = 2
def max = a > b ? a : b
assert max == 3
以上的程式在 a 和 b 中取較大的值,若 a 大於 b 則取 a,反之則取 b。
Elvis 運算子
Elvis 運算子是三元運算子的變體,可撰寫較簡潔的程式碼。以下是一個使用三元運算子的實例:
def data = null
def var = data != null ? data : "Hello"
assert var == "Hello"
重新以 Elvis 運算子改寫如下:
def data = null
def var = data ?: "Hello"
assert var == "Hello"
Groovy 還有一些其他的運算子,但這些運算子會牽涉到其他的概念,故不在本文中說明。經過本文的介紹,讀者學到一些 Groovy 的運算子,也可視為 Groovy 的基本指令。