最简单的可以接受原语和元数据的Clojure对象? [英] Simplest possible Clojure object that can accept a primitive and metadata?

查看:180
本文介绍了最简单的可以接受原语和元数据的Clojure对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在Clojure的字节数组中添加元数据。因为这是不允许的,我想尝试的一个选项是可以工作的最简单的对象包装器。

I want to add metadata to a byte array in Clojure. Since this is not allowed, one option I want to try is the simplest object wrapper that could work.

这里是with-meta

让我开始看 Clojure.lang.IObj 。我还没有找到我想要的。

That made me start looking at Clojure.lang.IObj. I haven't found what I want yet.

推荐答案

以下是如何创建 deftype

Here's how you can create a deftype that supports metadata.

(import '(java.io Writer))

(deftype Box [value _meta]
  clojure.lang.IObj
  (meta [_] _meta)
  (withMeta [_ m] (Box. value m))
  clojure.lang.IDeref
  (deref [_] value)
  Object
  (toString [this]
    (str (.getName (class this))
         ": "
         (pr-str value))))

(defmethod print-method Box [o, ^Writer w]
  (.write w "#<")
  (.write w (.getName (class o)))
  (.write w ": ")
  (.write w (-> o deref pr-str))
  (.write w ">"))

(defn box
  ([value] (box value nil))
  ([value meta] (Box. value meta)))

这里有一些用法:

user> (def boxed (box (->> (range 5)
                        (map byte)
                        (byte-array))
                      {:stuff :foo}))
#<Var@1acd39b: #<Box@c50aa1: #>>
user> @boxed
[0, 1, 2, 3, 4]
user> (meta boxed)
{:stuff :foo}
user> (meta (with-meta boxed {:stuff :bar}))
{:stuff :bar}


$ b b

这是我可以想到把元数据放在一个字节数组( reify 不能使用 clojure.lang)的最简单的方法。

This is the simplest way I can think of to put metadata on a byte array (reify doesn't work with clojure.lang.IObj and records include more unrelated functionality).

另一个选项(可能更简单,取决于上下文)将存储字节数组一个地图,元数据或者作为实际的元数据。

Another option (and perhaps simpler depending on the context) would be to store the byte array in a map, with the metadata either right alongside it or as actual metadata.

这篇关于最简单的可以接受原语和元数据的Clojure对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆