gpt4 book ai didi

clojure - 命名空间限定记录字段访问器

转载 作者:行者123 更新时间:2023-12-04 01:45:42 24 4
gpt4 key购买 nike

同样的愚蠢错误我已经犯过很多次了:

(defrecord Record [field-name])

(let [field (:feld-name (->Record 1))] ; Whoops!
(+ 1 field))

由于我拼错了字段名关键字,这会导致 NPE。

对此“明显”的解决方案是让 defrecord 发出命名空间关键字,从那时起,尤其是在不同文件中工作时,IDE 将能够立即显示哪些关键字可用只要我输入 ::n/

我可能可以通过一些创意创建一个宏来包装 defrecord 来为我创建关键字,但这似乎有点过分了。

有没有办法让 defrecord 发出命名空间字段访问器,或者有没有其他好的方法来避免这个问题?

最佳答案

因为 defrecords 编译为 java 类和 java 类上的字段没有命名空间的概念,我认为没有让 defrecord 发出命名空间关键字的好方法。

如果代码对性能不敏感并且不需要实现任何协议(protocol)和类似协议(protocol),另一种选择是只使用 map 。

另一种方法类似于 Alan Thompson 的解决方案,即创建安全获取功能。 prismatic/plumbing 实用程序库也有此实现。

(defn safe-get [m k]
(let [ret (get m k ::not-found)]
(if (= ::not-found ret)
(throw (ex-info "Key not found: " {:map m, :key k}))
ret)))

(defrecord x [foo])

(safe-get (->x 1) :foo) ;=> 1

(safe-get (->x 1) :fo) ;=>

;; 1. Unhandled clojure.lang.ExceptionInfo
;; Key not found:
;; {:map {:foo 1}, :key :fo}

关于clojure - 命名空间限定记录字段访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43789826/

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