Clojure有一个非常好的解构语法,适用于数组和地图。
我经常在两者之间感到困惑,这意味着我不确定选择哪一个。我什么时候应该使用map作为参数,何时应该使用数组?
例如,我来自以下数据,我想传递一个经度和纬度。我可以将其作为{:lat 12 :lng 34}
或[12 34]
传递,或作为两个参数传递。
注意:我不会使用两个参数,因为我认为coords
绑定更好。
然后假设我想添加新字段(精度,高度,时间戳......),那么它的优势似乎就在于地图:
但是我经常最终得到一个函数,它将一个大的options
参数作为一个映射,并带有一些不相关的子选项。即使只有10个按键,感觉有点臃肿。
那么,我何时应该使用map,何时应该在函数参数中使用数组?在可读性/可扩展性/性能方面有哪些优点/缺点?另外,在这种情况下core.match
可以提供帮助吗?
答案 0 :(得分:2)
总结(虽然可能还有更多)
我会说像矢量这样的基于位置的数据结构很早就达到了极限。特别是如果数据结构在多个地方使用,并且比“listy”更具“描述性”。
为什么要映射?
最初它们易于使用且非常灵活,在开发过程中,它们可以轻松地交换records,这几乎与地图一样灵活,但是:
(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}
您可以将关键字带入地图或将其绑定到符合大小写的名称。