首页 > 解决方案 > 在 clojure 中存储对象及其特征的最佳方式是什么?

问题描述

一个对象至少有它的位置和尺寸,但可能还有其他字段,例如。

(def obj1 '(cup1 x 0 y 0 z 0 width 10 height 10))
(def obj2 '(cup2 x 0 y 0 z 0 width 10 height 10))
(def objs '(obj1 obj2))

如果我想访问和修改值、比较它们的名称或尺寸并允许我将来可能添加新字段,那么存储这些类型的对象的最有效方法是什么?

有没有像 python 中的有序字典之类的东西?

标签: clojure

解决方案


Clojure map 非常常用于此类事情,通常以 Clojure 关键字作为键,但键可以是字符串、符号、数字、向量等,任何不可变的 Clojure 值:

(def obj1 {:name "cup1" :x 0 :y 0 :z 0 :width 10 :height 10})
(def obj2 {:name "cup2" :x 0 :y 0 :z 0 :width 10 :height 10})
(def objs [obj1 obj2])

Clojure 映射是无序的,可以通过键快速查找以获取相应的值,并且快速“更新”,意思是“返回一个新映射,其中一个或多个键具有与之关联的新值”,由函数assoc和其他几个内置函数。

有一个第三方库提供了能够记住键/值对相对于彼此的插入顺序的映射,但 Clojure 开发人员很少使用它们:https ://github.com/clj-commons/ordered


推荐阅读