Clojure - 解构数组与映射

Clojure - destructuring array vs map

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

我经常在两者之间混淆,这意味着我不确定该选择哪一个。什么时候应该使用地图作为参数,什么时候应该使用数组?

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

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

然后假设我要添加新的字段(精度,海拔高度,时间戳...),似乎优势就转到地图上了:

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

那么,什么时候应该使用map,什么时候应该在函数参数中使用数组?就 readability/extensibility/performance 而言,pro/cons 是什么?另外,core.match 对这种情况有帮助吗?

总结一下(尽管可能还有更多内容)

我想说像向量这样基于位置的数据结构很早就达到了极限。特别是如果数据结构用在多个地方并且 "descriptive" 多于 "listy".

为什么要地图?

最初它们很容易使用并且非常灵活,在进一步的开发中它们可以很容易地交换为几乎与地图一样灵活的 records 但是:

  • 实际上是 classes/types
  • 因此具有纯java字段访问特性
  • 所以和protocols/interfaces
  • 玩得很好
  • 但几乎与地图一样灵活并且
  • 很好地使用各种解构
  • 它们提供了一套您不必自己实现的实用函数
    • (map->LngLat {...})(从地图生成 LngLat)和
    • (apply ->LngLat [...])(从向量构造 LngLat)
    • 可能更多...

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

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

Stuart Sierra 的这篇博客 post 很好地概述了这些功能。

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

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

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

您可以根据情况将键值放入映射中或将它们绑定到名称。