【发布时间】:2015-06-11 21:43:36
【问题描述】:
我刚刚开始学习 clojure,一直在阅读一些简单的示例,然后尽我所能使用 rtfm 获取概念。
但是,我对val 在下面的示例中所做的事情有点困惑。这取自 val 的 Clojure 文档示例。
(first {:one :two}) ;; => [:one :two]
这里,一个带有:one 键和:two 值的hash-map 被传递给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
如果我尝试在(我认为)hash-map(我意识到它实际上是一个“持久数组映射”)上调用 val,我会得到如上所示的异常。
我也对以下内容感到困惑:
(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 以返回值。从对map 的结果调用中返回sequence。这是阅读问题的正确方法吗?
一如既往,感谢您提供的所有帮助。
【问题讨论】:
-
映射条目是向量,但并非所有向量都是映射条目。
val仅适用于地图条目。 -
... 也就是说,
(type (first {:one :two}))=>clojure.lang.MapEntry
标签: clojure