clojure';val';是否返回此值?

clojure';val';是否返回此值?,clojure,Clojure,我刚刚开始学习clojure,已经阅读了一些简单的例子,然后尽我所能学习rtfm的概念 然而,我对下面示例中的val所做的事情感到有点困惑。这是从Clojure文档示例中获取的 这里,一个键为:1和值为:2的散列映射被传递到第一个。在幕后,Clojure将此哈希映射转换为向量的序列。因为在这个序列中只有一个向量,所以它返回[:一:二] (val (first {:one :two})) ;; => :two (val [:one :two]) ;; => ClassCastExcep

我刚刚开始学习clojure,已经阅读了一些简单的例子,然后尽我所能学习rtfm的概念

然而,我对下面示例中的
val
所做的事情感到有点困惑。这是从Clojure文档示例中获取的

这里,一个键为
:1和值为
:2的
散列映射
被传递到
第一个
。在幕后,Clojure将此
哈希映射
转换为
向量的
序列
。因为在这个
序列中只有一个
向量
,所以它返回
[:一:二]

(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
,我会得到如上所示的异常

我还对以下几点感到困惑:

(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)
我是这样读这句话的。以
数组映射为例
{:a1:b2}
。对于每个键值对,对该对调用
val
,以返回值。从对
map
的结果调用返回一个
序列
。这是阅读问题的正确方法吗


一如既往,感谢您的帮助。

val
返回映射条目的值,而不是映射

(first{:one:two})
返回第一个映射条目(尽管它看起来只是一个vec)


(map val{:one:two})
返回每个条目的值,它相当于
(vals{:one:two})
一个映射序列会产生
map条目
值,正如您所指出的,这些值看起来像向量,并且可以与向量进行比较

user=> (= (first {:a 1 :b 2}) [:a 1])
true
但他们不是同一类人吗

user=> (= (class (first {:a 1 :b 2})) (class [:a 1]))
false
因此,尽管
(first{:a1})
的repl上的输出看起来像一个向量,但它不是,它是一个
映射项,因此它可以传递给
val
,但是向量
[:a1]
不能,因此类强制转换异常

您对map正在做的事情的阅读在较高的层次上是正确的,更具体一点可能是“对于序列中的每个条目,从{:A1:B2}(它们是MapEntry值)调用每个条目(MapEntry)上的函数val,并从结果生成序列”

这将解释为什么

user=> (map val '([:a 1] [:b 2]))
将导致与序列生成的
Vector
元素相同的
ClassCastException
s,而不是
MapEntry
元素

(first {:one :two}) ;; # => [:one :two]  (this is a vector right? No, it's not.)

[:一:二]
在本例中是一个
地图条目
,而不是一个向量。

地图条目是一个向量,但并非所有向量都是地图条目<代码>val
仅适用于地图条目。。。。也就是说,
(键入(第一个{:one:two}))
=>
clojure.lang.MapEntry
(first {:one :two}) ;; # => [:one :two]  (this is a vector right? No, it's not.)