2024 Clojure调查中分享您的想法!

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

+1
记录与类型

来自RDF背景,我倾向于在定义属性时大量使用限定关键词。然而,在研究了Reitit HTTP路由器之后,我发现defrecord对性能非常有帮助。这通常使我在设计软件时面临性能与数据清晰表达之间的选择。

为了避免这种困境,我认为如果defrecord可以支持类似于为map解构已经实现的功能会很好。

(def m {:domain/id 14 :other/id "UV"})

(let [{:keys [domain/id]} m] id)
;;; ⤷ 14

我们可以这样

(defrecord Employee [domain/id domain/full-name]
  Object
  (toString [_]
    (str "<< id: " id ", name: " full-name " >>")))

(def alyssa (->Employee 14 "Alyssa P. Hacker"))

(.toString alyssa)
;;; ⤷ "<< id: 14, name: Alyssa P. Hacker >>"

(:domain/id alyssa)
;;; ⤷ 14

其中

  • 名称部分绑定在记录定义中,并用作Java内部类字段
  • 当通过类似的映射接口访问/操作记录对象时,使用全限定标识符。
  • 字段名称的冲突将抛出

我已经实现了一个原型来展示如何在实践中做到这一点。我想知道这种扩展是否已考虑用于clojure.core/defrecord,以及是否有我未注意到的设计/实现问题。

1 个回答

0

对于这样一个想法,需要考虑许多维度。记录在某个方面已经有了命名空间——即记录类型的命名空间。在同一个命名空间中有一个记录类型,而字段却是不同命名空间中的键可能看起来有点令人困惑。无论如何,我认为这不太可能很快引起人们的注意。

...