我剛剛開始學習clojure,並一直在閱讀一些簡單的例子,然後盡我所能去理解概念。clojure'val'返回這個值是什麼?
但是我對val
在下面的例子中做了什麼感到困惑。這已從Clojure doc示例中獲得,用於val。
(first {:one :two}) ;; => [:one :two]
在這裏,與hash-map
的:one
一個鍵和的:two
的值被傳遞給first
。在幕後,Clojure將hash-map
轉換爲sequence
的vectors
。由於此sequence
中只有一個vector
,因此它返回[:one :two]
。
(val (first {:one :two})) ;; => :two
(val [:one :two]) ;; => ClassCastException clojure.lang.PersistentVector cannot be cast to java.util.Map$Entry
(val {:one :two}) ;; => ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.util.Map$Entry
如果我嘗試致電val
一個(我認爲)一個hash-map
(我意識到這實際上是一個「老大難陣圖」),我得到的異常如上面看到的。
我也迷茫了以下內容:
(first {:one :two}) ;; # => [:one :two] (this is a vector right?)
(val [:one :two]) ;; # => ClassCastException (why doesn't this give back the same result as the example above?)
爲什麼我不能只是(first {:one :two})
結果插入val
,並得到同樣的結果?
此外,頁面上列出的另一個例子是:
(map val {:a 1 :b 2}) ;; => (1 2)
以下是我讀線。以array-map
{:a 1 :b 2}
。對於每個鍵值對,請在該對上調用val
以返回值。將所產生的電話的sequence
返回map
。這是解決問題的正確方法嗎?
一如既往,感謝您的任何幫助。
地圖條目是一個向量,但並非所有向量都是地圖條目。 'val'只適用於地圖條目。 – noisesmith
... to wit,'(type(first {:one:two}))'=>'clojure.lang.MapEntry' – Thumbnail