我正在使用clojure中的Java库,我想在这些对象添加一些额外信息时给他们做些什么。我正在考虑将信息存储为元数据,虽然我没有承诺,如果你有更好的建议,我很乐意听到它们。
基本示例是为BufferedImage
添加名称并将其存储为元数据。目标是处理图像,然后将名称拉回来。
(ns test.clj
(:import [java.awt BufferedImage]))
; define a new image and try to attach data
(let [image (new BufferedImage 200 200 1)]
(with-meta image {:name "myawesomepicture"}))
;generates the following error
;ClassCastException java.awt.image.BufferedImage
;cannot be cast to clojure.lang.IObj
;clojure.core/with-meta (core.clj:214)
最近有一篇文章定义了一个可以attach metadata to an array的类型,但这会包含在尝试使用对象时会触发类型错误的值,如下所示。 (box
是前一个链接的元数据包装函数; show
是mikera的imagez库中显示BufferedImage的函数。
(use 'mikera.image.core)
(def image1 (new BufferedImage 200 200 1))
(show image1) ; no problem
(def image2 (box image1 {:name "test"})) ; add metadata using box wrapper function
(show image2) ; ClassCastException Box cannot be cast to java.awt.image.BufferedImage
我很感激使用clojure用自定义数据标记Java对象的任何想法 - 无论是元数据还是字段等等。
感谢, zach cp