【发布时间】:2016-05-24 10:13:22
【问题描述】:
user=> (def m (sorted-map 1 2))
#'user/m
user=> (map? m)
true
user=> (get m :type)
ClassCastException java.lang.Long cannot be cast to clojure.lang.Keyword
clojure.lang.Keyword.compareTo (Keyword.java:114)
sorted-map 似乎选择了数值比较功能,不会与关键字进行比较。
最好推理一下,“这个东西支持 IPersistentMap。所以,我可以在它上面调用get 以查明它是否是我知道的一种地图,而不会有抛出异常的风险。” get 的文档字符串表示“如果键不存在,则返回映射到键、未找到或 nil 的值。”
在键查找时抛出异常是一个错误吗?更重要的是,是否有一种安全、标准的方法来检查任意对象是否属于给定的“类型”(由与其:type 键关联的值定义)?
【问题讨论】:
-
sorted-map 生成一个 TreeMap,它使用已排序的键进行排序。要找到特定的密钥,它应该将现有密钥与您请求的密钥进行比较,这就是失败的地方:
(< 1 :asd)。
标签: exception dictionary clojure dynamic-typing