2015-04-03 40 views
0

爲什麼在使用lein test運行時,以下測試的最後一個斷言失敗?使用聲明時Lein測試未通過未綁定var

我不明白爲什麼前兩個說法得到了後期綁定值正常,但fromvar值被看作是自由的。

(declare x) 

(def fromvar x) 
(defn fromfun [] x) 

(deftest declaretest 

    ;; These pass fine 
    (is (= 1 x)) 
    (is (= 1 (fromfun))) 

    ;; This fails on lein test: 
    ;; expected: (= 1 fromvar) 
    ;; actual: (not (= 1 #<Unbound Unbound: #'my-test/value>)) 
    (is (= 1 fromvar))) 

(def x 1) 
+0

使用'value'作爲你的價值,難以在回答你的問題 – noisesmith 2015-04-03 19:08:29

+0

當然清楚地使用正確的術語,你是對的,它改變爲x。 – mangolas 2015-04-03 20:19:56

回答

1

def不保證fromvar是聯繫在一起的value的結合。它在fromvar分配x的值時調用def。由於x尚未定義,因此該值未被綁定(字面意思是內部類Var.Unbound的一個實例)。 fromfun在編譯時沒有內聯x的值,因此可以在運行時自由地找到正確的值,以反映後面的分配。

+0

好的,所以這根本就不是什麼深奧的東西,我對此感到困惑,因爲使用IntelliJ並重新加載文件導致有問題的測試開始通過的情況。但那必須是因爲已經綁定x的(聲明x)什麼也不做,所以下次x實際上有一個值。感謝您解決這個問題。 – mangolas 2015-04-03 20:33:44