好的,然后我总结了以下几点
- `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)
谢谢!