變數可變性問題
從FP的角度, Clojure中變數是不可變的, 改變一個變數實際是建立一個新的變數
所以所有的change都需要通過引數的不斷傳遞…
如下面的例子,
=> (defrecord Employee [name room]) backtype.storm.util.Employee => (def emp (Employee. "John Smith" 304)) #`backtype.storm.util/emp => (:name emp) "John Smith" => (assoc emp :room 309) #backtype.storm.util.Employee{:name "John Smith", :room 309} => (println emp) #backtype.storm.util.Employee{:name John Smith, :room 304}
Clojure是一個妥協的語言,
不單純的從FP的角度思考, 也需要從OO的角度思考, 你可以認為這是靈活的體現
所以有時候, 單純的依賴引數的傳遞很麻煩…雖然很pure FP
希望有變數的可變性, 將結果暫存下來, 這樣無疑帶來了副作用(side effects), 但提供了些便利, 尤其對習慣於oo思維的工程師
兩種方法 ,
1. 使用java物件
雖然說clojure變數是不可變的, 但是如果在clojure裡面直接使用Java物件, 相當於跳過了clojure這層, 如下面的例子,
=> (import `java.awt.Point)
java.awt.Point
=> (def pt (Point. 5 10))
#`backtype.storm.util/pt
=> (.x pt)
5
=> (set! (.x pt) -42)
-42
=> (.x pt)
-42
可以看到在storm裡面, 仍然有大量的程式碼是用java實現的, 尤其是類的封裝, 為什麼不全用clojure? 可以思考
2. 當然clojure並不是沒有考慮到這個問題, 他提倡的是管理可變變數
通過ref, atom, 其實是定義reference, 變數本身是不變的, 可以通過swap!將ref或atom切換到不同的變數上
=> (def test-ref (atom {})) #`backtype.storm.util/test-ref => (swap! test-ref assoc :a 1) {:a 1} => @test-ref {:a 1}
本文章摘自部落格園,原文釋出日期:2013-08-16
相關文章
- golang變數作用域問題-避免使用全域性變數Golang變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 通過String的不變性案例分析Java變數的可變性Java變數
- Python閉包區域性變數問題Python變數
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- 全域性變數與區域性變數變數
- [Python學習] 專題六.區域性變數、全域性變數global、匯入模組變數Python變數
- 宣告變數的問題變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- PHP的可變變數名PHP變數
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- 靜態全域性變數和全域性變數變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- shell 變數賦值問題變數賦值
- python全域性變數與區域性變數Python變數
- Dll堆疊問題(Dll的靜態變數與全域性變數、vs的MT與MD)變數
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- 全域性變數變數
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- vue 變數賦值同時改變的問題Vue變數賦值
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- python全域性變數和區域性變數, globalPython變數
- 【Java】可變引數Java
- Swift: 可變引數Swift
- Java可變引數Java
- Java 可變引數Java
- 成員變數和區域性變數變數
- Shell變數的作用域問題變數
- js中變數作用域問題JS變數
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- ODI第9節-變數(三):全域性變數變數