我有一些看起来像这样的 clojure 代码:
(defn rect [x y w h]
{:x x, :y y, :w w, :h h})
(def left :x)
(def top :y)
(def width :w)
(def height :h)
(defn right [r]
(+ (left r) (width r)))
(defn bottom [r]
(+ (top r) (height r)))
现在下面的代码似乎有点不常见:
(def left :x)
但是我不知道任何其他方式来获得封装。
假设,我稍后想以不同的方式表示我的矩形。然后依赖 (:x rect) 不是一个好主意,因为 :x 仅适用于 hashmap 和记录,所以我会在 api 中泄露实现细节,至少在 OO 语言中这被认为是不好的做法。
现在,如果我决定在 java 中实现我的 rect,它会变得更糟,因为那时我将不得不编写如下包装器:
(defn left [rect] (.getLeft rect))
以确保界面不会改变。
clojure 如何解决这个问题?