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}
您可以根据情况将键值放入映射中或将它们绑定到名称。
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}
您可以根据情况将键值放入映射中或将它们绑定到名称。