Clojure:以类似单子的方式避免NPE的惯用/干净的方法
我有点懊恼,一些内置的Clojure函数在我看来是不一致的行为 我正在尝试这样做:Clojure:以类似单子的方式避免NPE的惯用/干净的方法,clojure,Clojure,我有点懊恼,一些内置的Clojure函数在我看来是不一致的行为 我正在尝试这样做: (let [kwns (namespace (keyword v))] ...) 在v可能是nil的上下文中。关键字函数按照我的预期工作(返回nil),但名称空间抛出一个NPE 我的印象是单子在Clojure中并不经常使用,因为无双关语似乎是惯用的形式(这一点一直在讨论) 我以为KWN的成绩是零,而不是NPE。当这种不一致性出现时,什么是保持代码干净的推荐方法……当然,在我的代码中插入nil检查并不是我
(let [kwns (namespace (keyword v))]
...)
在v可能是nil
的上下文中。关键字
函数按照我的预期工作(返回nil
),但名称空间抛出一个NPE
我的印象是单子在Clojure中并不经常使用,因为无双关语似乎是惯用的形式(这一点一直在讨论)
我以为KWN的成绩是零,而不是NPE。当这种不一致性出现时,什么是保持代码干净的推荐方法……当然,在我的代码中插入
nil
检查并不是我想要的答案。一些->对你有用吗
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"
太好了…我就知道一定有什么!