作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当您传递的内容不是需要映射的映射时,我有点惊讶地看到某些函数默默地返回 nil
(或您传递的默认值)。
首先看下面的文档和示例,它按我的预期工作:
user> (doc dissoc)
-------------------------
clojure.core/dissoc
([map] [map key] [map key & ks])
dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
that does not contain a mapping for key(s).
dissoc 的第一个参数必须是文档中的映射,因此会发生以下情况:
user> (dissoc {:a 1 :b 2} :b)
{:a 1}
效果很好,我传递了一张 map 。让我们将不是映射的东西传递给该函数,该函数的文档说第一个参数应该是映射:
user> (dissoc 1 :b)
ClassCastException java.lang.Long cannot be cast to clojure.lang.IPersistentMap clojure.lang.RT.dissoc (RT.java:758)
很公平,在运行时抛出异常,并且问题很清楚,这是我期望的行为。
现在让我们来看另一个函数:
user> (doc get)
-------------------------
clojure.core/get
([map key] [map key not-found])
Returns the value mapped to key, not-found or nil if key not present.
get
的第一个参数必须是根据文档的 map ,发生的情况如下:
user> (get {:a 1} :a)
1
到目前为止一切顺利。让我们将不是映射的东西传递给该函数,该函数的文档说第一个参数应该是映射:
user> (get 42 :a)
nil
也不异常(exception)。没什么。只是无声的“失败”。
当您传递不是映射且不是另一个函数的内容时,为什么一个函数会抛出异常,尽管这两个函数的文档明确指出第一个参数必须是映射?
是否有一个“规则”可以知道在 Clojure 中何时会出现异常或 nil
或者我应该期望这种东西不一致?
作为一个附带问题:如果 get 被修改为抛出异常,而不是在您不传递您所需要的映射时默默地返回 nil,Clojure 和 Clojure 程序会“中断”吗?应该吗?
最佳答案
对于非关联参数的 get
可能会抛出异常,如您的示例所示:
(contains? 42 :a)
;=> IllegalArgumentException
(get 42 :a)
;=> nil ??
这是一个open issue in Clojure's Issue Tracker 。正如问题描述中所述,当前返回 nil
的行为很可能是一个错误,并且可能会掩盖编程错误。
关于exception - 当传递非映射参数时,期望映射的函数什么时候会默默地返回 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21314380/
我是一名优秀的程序员,十分优秀!