好了,所以我认为
- `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集合。我们使用Clojure的正常集合函数深入其中。当我们达到另一个可导航值时,我们调用nav来获取下一页。
唯一让我有些困惑的是。如果你看看我的示例,我假设nav返回一个数据化的结果。但Sean提到它不应该这样做。但这在我的示例中甚至没有意义。我开始于一个URL。我可以导航到这个URL以获取页面,但还没有`coll`上下文。并且我可以让nav返回一个非数据的对象,但我没有这种东西,仅为此而创建一个似乎很奇怪。
所以我假设在这里`nav`可以返回数据或数据化的事物,这并不重要。而且假设无论是什么都会调用datafy,不管它是否已经是数据,因为那是对Map的默认实现。
所以你会继续这样做
(let [url (as-url "
https://clojure.org")]
clojure-page-as-coll (datafy url)
overview-url (get-in coll [:links :overview])
概述页面(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)
谢谢!