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