clojure - 在 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 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
推荐阅读
- windows - cmd wmic在Windows中逃脱噩梦
- python - 为什么我的 google colab 会话不断崩溃?
- angularjs - 如何在 AngularJS 的模态实例控制器上访问控制器方法?
- c# - 确保调用api成功并保存自己成功
- php - 使用 netbeans IDE 调试 PHP 应用程序
- r - 混合模型中的计划对比
- python - 无法在 Django 模板中获取字典值
- python - 将 dict 的 pandas 数据框列展开为数据框列
- javascript - 如何将 JavaScript 数据放入 Gmail 识别为 URL 的 URL?
- spring - 将 Spring Integration 与 Spring MVC 结合使用时出现部署错误