好吧,所以我推测
- `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`,不论什么情况,但如果它已经是数据,`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)
谢谢!