我刚刚开始学习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