gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:38:44 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com