Clojure:以单一方式避免NPE的惯用/清洁方式

Ton*_* K. 6 clojure

我有点懊恼,一些内置的Clojure函数在我看来是一种不一致的行为.

我正在尝试这样做:

 (let [kwns (namespace (keyword v))]
   ...)
Run Code Online (Sandbox Code Playgroud)

在v可能的上下文中nil.该keyword函数按预期(返回nil)工作,但命名空间抛出NPE.

我认为monad并不经常用于Clojure,因为nil-punning似乎是惯用的形式(正如本文详细介绍的那样).

我预计kwns会出现零,而不是抛出NPE.当这种不一致引起丑陋的头脑时,保持代码清洁的推荐方法是什么...... 当然,对nil我的代码进行检查并不是我想要的答案.

cfr*_*ick 10

会对some->你有用吗?

 user=> (doc some->)
 -------------------------
 clojure.core/some->
 ([expr & forms])
 Macro
   When expr is not nil, threads it into the first form (via ->),
   and when that result is not nil, through the next etc
 nil
 user=> (some-> nil keyword namespace)
 nil
 user=> (some-> "user/a" keyword namespace)
 "user"
Run Code Online (Sandbox Code Playgroud)

  • 完美......我知道必须要有东西! (2认同)