那么,我有以下理解:
- "v" 是我们要导航到的位置。
- "coll" 应该是调用 "datafy" 后的结果
- "v" 应该包含在 "coll" 中,可以通过 "k" 来提取
因此,一个使用场景可以是
(let [coll (datafy some-obj)
k :next-thing
v (get coll k)]
(nav coll k v))
这将返回另一件事(即任意可datafy的Object),这是通过导航到 "v" 获得的。
在这个意义上,"v" 应该是一个超链接,它实际上不是一个集合,这就是为什么我们导航到超链接指向的内容,这样会返回另一件事,我们以后也可以将其datafy,并且可能进一步导航。
所以一个完整的例子可以是
(let [url (as-url "
https://clojure.org")
clojure-page-as-coll (datafy url) ...
在这个阶段,根据URL的datafy实现方式,我们可以假设我们得到了以下结果
{: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) ...
因此,在这一阶段,我们将一个URLdatafy为一个Clojure集合。并使用正常的Clojure集合函数深入其中。当我们到达另一个Navigable值时,我们对其调用nav以获取下一页面。
我只是有一点困惑。如果你看我的例子,我假设nav返回一个datafied结果。但Sean提到它不应该这样做。但在我的例子中这甚至没有意义。我从URL开始。我可以导航到这个URL以获取页面,但还没有coll上下文。而且我可以让nav返回的东西不是已经data的数据,但没有这样的事情,仅仅是因为看起来很奇怪。
这里我假设`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)
谢谢!