好吧,所以我理解为
- `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)
概览页面为Coll(数据化概览页面)
概览页面)
这是正确的吗?还是实际上应该从`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)]
概览页面)
谢谢!