好吧,所以我认为
- `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 的 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) ...
所以现在我们已将一个 URL 作为 Clojure 集合进行了序列化。我们使用常规的 Clojure 集合函数进行了深入探索。当我们达到了另一个可导航值时,我们对其调用 nav 来获取下一页。
我对其中有几点仍然感到困惑。如果你看我提供的例子,我假设 nav 返回了一个序列化的结果。但肖恩提到它不应该返回,但在我提供的例子中这甚至都没有意义。我从 URL 开始。我可以 nav 到这个 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)
谢谢!