请分享您的想法,参加2024 Clojure状态调查!

欢迎!请参阅关于页面以了解有关此功能的更多信息。

0
协议

我有一个看起来像这样的map结构

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

即一个包含多个键的顶层map,其中一些键的值为符合相同结构的map。

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

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

是否应该在顶层map上或在每个内部map上都放置nav函数?

1 个答案

0

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

但是值得考虑完整的上下文(对于使用datafy和nav的REBL和其他工具):您开始于“东西”,然后通过这些工具对其进行“datafy”,以产生可以 navigating via get等,也可以通过nav navigable的“纯数据”。

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

然后从“纯数据”->get->;“新的纯数据”,或从“纯数据”->nav->;“与新的纯数据相对应的新东西”。

因此,您可能希望从支持 datafy 元数据开始您的地图,以便当 REBL 等进行数据化时,结果可以导航 - 并且可以作为 REBL 等显示的一部分,在数据化过程中增加额外的键和/或元数据。

如果您以纯数据(带有 nav 元数据)开始,对它使用 datafy 应该是一个恒等函数,因此您只需向原始地图添加 nav 元数据即可。我个人认为从 datafy 元数据开始(并让实现添加 nav 元数据)会更好,这样“东西”> datafy > 数据 > nav > 新东西的模式会更明确。这是我采取的方法 clojure.java.jdbcnext.jdbc -- 我在 2018 年 12 月关于 datafy/nav 写了博客

...