2024 Clojure状态调查! 分享您的想法。

欢迎!请查看 关于 页面了解更多关于如何工作的信息。

0
协议

我有一个类似这样的map结构

 {:a "this"
  :b {:x "foo" :y 1}
  :c "that"
  :d {:x "bar" :y 2}
  :e "the other"}

也就是说,一个顶层map包含好几个键,其中一些的值是具有相同结构的map。

那个内部map结构中的冒号x和冒号y的值可以应用到一个函数,该函数可以检索另一个map或可能导航到的可数据化对象。这使我想到了实现Navigable协议,以便我可以使用REBL浏览这些数据。

为了做到这一点,我了解到我需要创建一个(nav coll k v)函数,并将其作为元数据应用于map。我的问题是这样的

nav函数应该放在顶层map上,还是放在每个内部map上?

1 回答

0

您需要将包含clojure.datafy/nav的元数据作为键(以及您的nav函数作为值)添加到将传递给nav的集合中,即内部map。

但是,值得考虑的是完整上下文(对于REBL和其他使用datafynav的工具):您开始于“东西” —— 首先通过这些工具进行datafy,生成可以进行导航的“纯数据”,这也可以通过get等方法以及通过nav

因此,您从“东西” ---->datafy ---- “纯数据”(加上nav元数据)。

然后从"纯净数据" -> get -> "新的纯净数据",或者从"纯净数据" -> nav -> "与新的纯净数据对应的新事物"。

因此,你可能希望从支持datafy元数据的地图开始,这样当REBL等数据结构化时,结果就是可导航的 - 而且可以作为REBL等显示的一部分进行增强,添加额外的键和/或元数据。

如果你从纯净数据(带有nav元数据)开始,对它调用datafy应该是恒等函数,因此你可以在原始地图中加入nav元数据。我个人认为从datafy元数据开始更好(让实现添加nav元数据),这样事物 -> datafy -> 数据 -> nav -> 新事物模式的表达更明确。这是我在clojure.java.jdbcnext.jdbc中采用的方法 - 我在2018年12月关于datafy/nav的方法撰写了博客

...