大家好,我是對於 Clojure 一無所知的菜鳥小白工程師。
今天來學習 def
。
click Try Clojure to start clojure!
當我們在 Clojure 中使用def
時,實際上是在將一個名稱與某個值綁定在一起:
(def failed-protagonist-names
["Larry Potter" "Doreen the Explorer" "The Incredible Bulk"])
failed-protagonist-names
; => ["Larry Potter" "Doreen the Explorer" "The Incredible Bulk"]
在這個例子中,我們正在將名稱 failed-protagonist-names
綁定(binding)到一個包含三個字串的向量(Vectors)上。
Vectors - 向量,將於之後的章節學習。
值得注意的是,我們使用了 綁定
(binding) 這個術語,而在其他程式語言中,大家可能會說正在 分配
(assign) 一個值給一個 變數
(variable)。
其他語言通常可以多次對同一個變數進行分配。
舉個例子,在 Ruby 中,我們可能會多次對一個變數進行分配:
# ruby
severity = :mild
error_message = "OH GOD! IT'S A DISASTER! WE'RE "
if severity == :mild
error_message = error_message + "MILDLY INCONVENIENCED!"
else
error_message = error_message + "DOOOOOOOMED!"
end
我們也來嘗試在 Clojure 中做類似的事情:
(def severity :mild)
(def error-message "OH GOD! IT'S A DISASTER! WE'RE ")
(if (= severity :mild)
(def error-message (str error-message "MILDLY INCONVENIENCED!"))
(def error-message (str error-message "DOOOOOOOMED!")))
然而,像這樣改變與名稱相關聯的值,可能會使我們更難理解程式的行為,因為更難知道哪個值與名稱相關聯或為什麼該值可能已經變更。
隨著我們學習 Clojure,會發現我們很少需要更改名稱/值的關聯。
以下是我們可以編寫前面程式碼的一種方式:
(defn error-message
[severity]
(str "OH GOD! IT'S A DISASTER! WE'RE "
(if (= severity :mild)
"MILDLY INCONVENIENCED!"
"DOOOOOOOMED!")))
(error-message :mild)
; => "OH GOD! IT'S A DISASTER! WE'RE MILDLY INCONVENIENCED!"
在這裡,我們創建了一個名為error-message
的函數,它接受一個名為severity
的參數,並根據該參數來確定應返回哪個字串。
然後,你使用:mild
作為嚴重性參數來呼叫該函數。
與此同時,我們應該將 def
視為定義常數的方式,不要輕易去更改它的值。‘
我們來複習一下今天學到的東西:
def
視為定義常數(constants),不能視作變數。