gpt4 book ai didi

clojure - 如何封装在clojure中?

转载 作者:行者123 更新时间:2023-12-04 18:44:14 25 4
gpt4 key购买 nike

我有一些看起来像这样的 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 如何解决这个问题?

最佳答案

您可以使用协议(protocol)。

首先是 Clojure 记录:

(defprotocol Rectangular
(left [this])
(right [this]))

(defrecord Rect [x y w h]
Rectangular
(left [this] x)
(right [this] (+ x w)))

(def my-rect (Rect. 1 2 3 4))
(right my-rect) ;=> 4

现在是一个 Java 对象:
(import java.awt.Rectangle)

(extend-type Rectangle
Rectangular
(left [this] (int (.getX this)))
(right [this] (int (+ (.getX this) (.getWidth this)))))

(def my-other-rect (Rectangle. 1 2 3 4))
(right my-other-rect) ;=> 4

关于clojure - 如何封装在clojure中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17725224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com