好吧,那么我明白了
- `v` 是我们要导航进去的内容。
- `coll` 应该是`datafy`调用后的结果
- `v` 应该包含在`coll`中,可以通过`k`检索
因此,一个使用场景可能是
(let [coll (datafy some-obj)
k :next-thing
v (get coll k)]
 ;(nav coll k v))
这将返回另一个事物(即任意可数据化的对象),这是从导航到`v`中获得的。
从这个意义上讲,`v`应该是一个超链接,它实际上不是一个集合,这就是为什么我们导航到超链接所指的地方,这将返回另一个我们可以稍后数据化的事物,并可能进一步导航。
所以一个完整的例子可能是
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url) ...
在这一步,根据URL的数据化实现,我们可以假设我们得到了以下结果
{:content
:links {:get-started (as-url "
https://clojure.org/guides/getting_started")
:overview (as-url "
https://clojure.org/about/rationale")
...}
...}
因此,如果我们想导航到[:links :overview],我们会这样做
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
overview-page (nav clojure-page-as-coll [:links :overview] overview-url) ...
所以到这个点,我们已将一个URL作为Clojure coll数据化了。我们使用正常的Clojure集合函数深入挖掘它。当我们到达另一个可导航值时,我们在它上面调用nav以获取下一页。
我还有一点不太清楚。如果你看我的示例,我假设 `nav` 会返回一个数据化结果。但Sean提到它不应该这样。但这在某些情况下在我的示例里是不成立的。我开始从一个URL开始。我可以导航到这个URL来获取页面,但没有`coll`上下文。而且我无法让nav返回不是数据的东西,我没有这样的东西,只是随便造成一个似乎很奇怪。
所以我这里假设`nav`可以返回数据或数据化东西,这实际上并不重要。并且假设无论是什么都被调用了`datafy`,但如果它已经数据化了,datafy会直接返回数据,因为这是Map的默认实现。
所以你会继续这样做
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
overview-page (nav clojure-page-as-coll [:links :overview] overview-url)
overview-page-as-coll (datafy overview-page)]
overview-page)
这是正确的吗?或者你实际上应该以 `nav` 开头?也许我的示例不好,因为在这里`datafy`显得是多余的,因为某人可以这样做了
(let [clojure-page (nav nil nil (as-url "
https://clojure.org"))
overview-url (get-in clojure-page [:links :overview])
overview-page (nav clojure-page [:links :overview] overview-url)]
overview-page)
谢谢!