Clojure-分解数组与映射
Clojure有一个非常好的解构语法,它适用于数组和映射 我经常混淆两者,这意味着我不确定该选择哪一个。什么时候应该使用贴图作为参数,什么时候应该使用数组 例如,我得到了以下数据,我想传递一个经度和一个纬度。我可以将其作为Clojure-分解数组与映射,clojure,clojurescript,destructuring,Clojure,Clojurescript,Destructuring,Clojure有一个非常好的解构语法,它适用于数组和映射 我经常混淆两者,这意味着我不确定该选择哪一个。什么时候应该使用贴图作为参数,什么时候应该使用数组 例如,我得到了以下数据,我想传递一个经度和一个纬度。我可以将其作为{:lat 12:lng 34}或[12 34]传递,也可以作为两个参数传递 注意:我不使用两个参数,因为我认为使用coords绑定更好 然后假设我想添加新字段(精度、高度、时间戳…),那么优势似乎就体现在地图上: 如果有更多的参数,数组的可读性似乎不太好(您必须查看原型才能
{:lat 12:lng 34}
或[12 34]
传递,也可以作为两个参数传递
注意:我不使用两个参数,因为我认为使用coords
绑定更好
然后假设我想添加新字段(精度、高度、时间戳…),那么优势似乎就体现在地图上:
- 如果有更多的参数,数组的可读性似乎不太好(您必须查看原型才能理解解构,从而了解所使用的参数)
- 在地图中,我可以添加新字段,并以自描述性方式打印(键充当标签)
options
参数作为映射的函数结束,并带有一些不相关的子选项。它感觉有点臃肿,即使只有10个键
那么,什么时候应该使用map,什么时候应该在函数参数中使用数组?在可读性/可扩展性/性能方面有哪些优点/缺点?另外,在这种情况下,core.match
是否有帮助?总结一下(尽管可能还有更多)
我想说,基于位置的数据结构,比如向量,很早就达到了极限。尤其是如果数据结构用于多个地方,并且更具“描述性”而非“列表性”
为什么是地图
最初,它们易于使用且非常灵活,在开发过程中,它们可以很容易地交换,几乎与地图一样灵活,但:
- 是实际的类/类型
- 因此具有纯java字段访问特性
- 因此,可以很好地使用协议/接口
- 但它们几乎和地图和地图一样灵活
- 很好地处理各种解构
- 它们提供了一套您不必自己实现的util函数
(从地图生成LngLat)和(地图->LngLat{…})
(从向量构造LngLat)(应用->LngLat[…])
- 可能更多
(hash-map 1 2 3 4) ;{1 2, 3 4}
(assoc {1 2} 3 4) ;{3 4, 1 2}
您可以将keyvals放入地图中,或者根据具体情况将其绑定到名称 不要忘记,您可以轻松地将地图转换为记录,从而获得java快速现场访问性能,同时保持地图的大部分功能(关于访问);vectorsedit无法做到这一点:请参阅最简单的示例和非常有趣的@birdspider。但是为什么我们不能用向量来做呢?从你的垃圾桶里,我看不出有什么区别?(我从未使用过记录,也许这就是原因,但它似乎只需要一个参数列表,这听起来更接近数组而不是映射?)。在我的pastebin中,我只是概述了互换使用记录而不是映射的简单性,使用记录可以在不牺牲映射灵活性的情况下获得各种东西(即性能);更多内容:
user=>(assoc(LngLat.0):lat 3)#user.LngLat{:lng 0,:lat 3}
和user=>(map->LngLat{:lat 3:lng 2})#user.LngLat{:lng 2,:lat 3}
如果没有键名,您将如何做到这一点?进一步的记录实际上会生成一个类,因此您可以在LngLat上使用协议调度,而映射则必须使用多方法(我想,或者其他不太聪明的duck类型)因为你/clojure会如何区分点{:x:y}
map和my.name.space.cartesianfobar{:x:y}
map