在clojure中向Java对象添加元数据

时间:2015-01-15 23:25:22

标签: clojure metadata

我正在使用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

0 个答案:

没有答案