好吧,那么我了解到
- `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])
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)
谢谢!