好的,那么我明白了...
- `v` 是我们要导航到的目标。
- `coll` 应该是调用 `datafy` 所得到的返回结果。
- `v` 应该包含在 `coll` 中,可以通过 `k` 来获取。
因此,一个使用场景可以是:
(let [coll (datafy some-obj)
k :next-thing
v (get coll k)]
(nav coll k v))
这将返回另一个东西(也就是任意可datafy的对象),它是从导航到 `v` 获取的。
从这个意义上说,`v` 应该是一个超链接,它实际上不是一个集合,这就是为什么我们导航到超链接指向的地方,从而返回另一个东西,我们可以随后再对其进行datafy操作,并进一步导航。
所以一个完整的例子可以是:
(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集合进行了datafy,并使用正常的Clojure集合函数进行了深入探索。当我们达到另一个可导航值时,我们调用nav来获取下一页。
唯一让我有点困惑的是,如果你看我的例子,我假设`nav`返回datafied结果。但Sean说这不应该这样。但在我的例子中这也不合理。我从URL开始。我可以导航到这个URL以获取页面,但还没有`coll`上下文。我可以让nav返回一个非数据的东西,但我没有这样的东西,随意编造一个似乎也有些奇怪。
因此,我假设`nav`可以返回数据或datafiable对象,这并不重要。同时假设无论如何都会调用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)
概述页作为集合(datafy概述页)
概述页
这是正确的吗?或者你应该真正从`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)]
概述页
谢谢!