exception - 当传递非映射参数时,期望映射的函数什么时候会默默地返回 nil?

标签 exception dictionary clojure

当您传递的内容不是需要映射的映射时,我有点惊讶地看到某些函数默默地返回 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/

相关文章:

java - 在Java中编写表示 "do nothing"的注释的常见做法是什么?

php - throw 是如何工作的?

c++ - 删除所有具有零值的映射键

clojure - 限制更新频率的想法

android - 在 Android 上使用 Web 服务时出现异常错误

java - 连接 JMXConnector 时出现 NoInitialContextException

python - 通过索引访问 collections.OrderedDict 中的项目

c# - 包含在 C# 中的字典中

Clojure,用集合中的不同值替换字符的每个实例

postgresql - 查询 Postgres 数据库 - Clojure