iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
1
Software Development

擁抱 Clojure系列 第 5

[第 05 天] 擁抱 Clojure:資料結構與型態(二)

資料結構與型態(二)

字串與字符

Clojure 的字串即是 Java 的 String 類型,表現方法也跟 Java 一樣用雙引號包住文字:

(class "foo")
;; => java.lang.String

多行字串只要在需要的時候換行即可:

"This multi-
line string"
;; => "This multi-\nline string"

字符是字串的組成元素,使用方法爲將反斜線 (\) 加到文字的前面,型態爲 java.lang.Character:

(class \j)
;; => java.lang.Character
\j
;; => \j

萬國碼 (Unicode) 以及八進位表示法也可以用在字符表示上:

\u00eb
;; => \ë
\o44
;; => \$

請注意,八位元字符最前面加上的是反斜線 (\) 與小寫字母 o (Octal),並不是數字 0。

布林

當運算式使用到流程控制時,需要使用布林型態來決定該往那個分支進行。Clojure 的布林型態有 true 以及 false 兩種。內部型態爲 Java 的 java.lang.Boolean:

(class true)
;; => java.lang.Boolean
true
;; => true
false
;; => false

Clojure 提供了一些函式用來判斷是否爲真:

(true? true)
;; => true
(true? false)
;; => false

在 Clojure 的命名習慣裡,會將一個返回真假值的函式,在名稱後面加上問號 (?)。這樣的函式稱做「述詞函式」 (Predicate)。

Clojure 也提供了一些函式判斷是否爲假:

(false? false)
;; => true
(false? true)
;; => false

除了布林型態之外,nil 用來表示不存在以及虛無,與 Java 中的 null 相同。當 nil 用在條件判斷時,nil 被當作 false

(true? nil)
;; => false
(false? nil)
;; => false
(nil? nil)
;; => true

Clojure 使用 = 來判斷兩個事物是否相等,內部使用 Java 物件的 equals 方法來判斷:

(= 1 1)
;; => true
(= "Hello" "HELLO")
;; => false
(= "Hello" 1)
;; false

符號

符號 (Symbol) 是個標識符 (Identifier),用來指向它所代表的值。對它求值時,會返回它指向的值。在 Clojure 中,所有非數字開頭的名稱都是一個個符號,分別代表數字、字串、集合或函式,每個符號都隸屬於一個命名空間。內部使用的型態爲 clojure.lang.Symbol:

(def username "Rich")
;; => #'user/username
username
;; => "Rich"
(class 'username)
;; => clojure.lang.Symbol

在運算式中直接使用符號,Clojure 會嘗試對它求值,如果這個符號尚未指向任何資料,就會出現例外。所以需要在符號前面加上單引號 (‘),告訴 Clojure 這個符號不需要求值。

(class average)
;; => CompilerException java.lang.RuntimeException: Unable to resolve symbol: average in this context
(class 'average)
;; => clojure.lang.Symbol

你可以使用 symbol 函式創建一個符號:

(symbol "foo")
;; => foo
(symbol "foo" "bar")
;; => foo/bar

關鍵字

關鍵字 (Keyword) 跟符號一樣,是個標識符,但是跟符號不同的是,關鍵字並不指向任何資料,關鍵字被求值時,返回的仍是被求值的關鍵字,關鍵字只代表自己。命名時在名稱前加上冒號 (:),內部使用的資料型態爲 clojure.lang.Symbol:

(class :foo)
;; => clojure.lang.Symbol
:foo
;; => :foo

你可以使用 keyword 函式創建一個關鍵字:

(keyword "foo")
;; => :foo

關鍵字常見的使用方法是跟映射 (Map) 搭配使用,作爲映射的索引鍵。

(未完待續)


上一篇
[第 04 天] 擁抱 Clojure:資料結構與型態(一)
下一篇
[第 06 天] 擁抱 Clojure:資料結構與型態(三)
系列文
擁抱 Clojure30

尚未有邦友留言

立即登入留言