好了,所以我觉得
- `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) ...
在此基础上,根据数据fy 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)
谢谢!