假设我们正在使用面向对象的语言,并且有两个类X和Y,并且这些类之间存在双向关系。
因此,X的实例可以指向Y的实例,反之亦然。
在Clojure课程中,通常会翻译成地图,所以我们可以:
{:type :x :name "instance of X"}
{:type :y :name "instance of Y"}
我们如何在不使用“外键”之类的东西的情况下表示这些“对象”之间的双向关系?或者这通常是直接委托给数据库的东西吗?
答案 0 :(得分:4)
在Clojure中看到深层嵌套的地图很常见,它们对应于面向对象语言中的分层对象树,例如。
{:type :x
:name "instance of X"
:y {:type :y
:name "instance of Y"}}
事实上,这很常见,clojure.core
提供了get-in
,assoc-in
和update-in
等核心功能,以便于使用此类结构。
当然,当被建模的对象之间存在自然的层次结构或所有权关系时,这种方法效果最好。在循环引用的情况下,这种结构被破坏(假设您坚持使用持久性数据结构) - 要了解原因,请尝试构建一个将自身包含为值的Clojure映射。
我通常看到的方法是使用atom
引入一个间接层:
(def x {:type :x, :name "x instance", :y (atom nil)})
(def y {:type :y, :name "y instance", :x (atom nil)})
(set! *print-level* 3) ;; do this in the REPL to avoid stack overflow
;; when printing the results of the following calls
(reset! (:y x) y)
(reset! (:x y) x)