好吧,所以我得出以下结论
- `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) ...
所以到了这一点,我们数据化了Clojure coll。我们已经使用了正常的Clojure集合函数深入挖掘。当我们达到另一个可导航值时,我们对它调用nav以获取下一个页面。
我还有一些不太明白。如果你看我的例子,我假设nav返回一个数据化结果。但Sean提到它不应该这样做。但这在我例子中甚至说不通。我从一个URL开始。我可以在该URL中进行nav以获取返回的页面,但没有coll上下文。而且我可以让nav返回的不是已数据化的东西,但我没有这样的东西,并且空想一个似乎很奇怪。
这里我假设`nav`可以返回数据或其他可数据化事物,这并不重要。并且数据化将总是被调用,但如果它已经是数据,数据化函数将只返回数据,因为这是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)
谢谢!