Clojure - 解构阵列与地图

时间:2015-08-18 11:01:12

标签: clojure clojurescript destructuring

Clojure有一个非常好的解构语法,适用于数组和地图。

我经常在两者之间感到困惑,这意味着我不确定选择哪一个。我什么时候应该使用map作为参数,何时应该使用数组?

例如,我来自以下数据,我想传递一个经度和纬度。我可以将其作为{:lat 12 :lng 34}[12 34]传递,或作为两个参数传递。

注意:我不会使用两个参数,因为我认为coords绑定更好。

然后假设我想添加新字段(精度,高度,时间戳......),那么它的优势似乎就在于地图:

  • 一个数组似乎没有更多参数的可读性(您必须查看原型以了解解构以及所使用的参数)。
  • 在地图中我可以添加新字段并打印它是自我描述的(键用作标签)。

但是我经常最终得到一个函数,它将一个大的options参数作为一个映射,并带有一些不相关的子选项。即使只有10个按键,感觉有点臃肿。

那么,我何时应该使用map,何时应该在函数参数中使用数组?在可读性/可扩展性/性能方面有哪些优点/缺点?另外,在这种情况下core.match可以提供帮助吗?

3 个答案:

答案 0 :(得分:2)

总结(虽然可能还有更多)

我会说像矢量这样的基于位置的数据结构很早就达到了极限。特别是如果数据结构在多个地方使用,并且比“listy”更具“描述性”。

为什么要映射?

最初它们易于使用且非常灵活,在开发过程中,它们可以轻松地交换records,这几乎与地图一样灵活,但是:

  • 是实用类/类型
  • 因此具有纯java字段访问特征
  • 因此可以很好地使用协议/接口
  • 但几乎和地图一样灵活,
  • 与各种解构很好地合作
  • 它们提供了一套您无需自己实现的util函数
    • (map->LngLat {...})(从地图生成LngLat)和
    • (apply ->LngLat [...])(从向量构造LngLat)
    • 可能更多......

答案 1 :(得分:1)

正如@birdspider在评论中指出的那样,记录可以帮助您组织地图的解构以及许多其他好处。

您在构建记录方面也有相当大的灵活性。您可以使用向量样式的位置参数,也可以将键作为映射传递。

Stuart Sierra撰写的此博客post概述了这些功能。

答案 2 :(得分:0)

另一种选择是使用 keyvals :一系列交替的键和值作为尾随参数。以这种方式设置了几个核心功能:

(hash-map 1 2 3 4) ;{1 2, 3 4}

(assoc {1 2} 3 4) ;{3 4, 1 2}

您可以将关键字带入地图或将其绑定到符合大小写的名称。