3

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

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

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

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

然后假设我想添加新字段(精度,高度,时间戳......),似乎优势然后转到地图:

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

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

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

4

3 回答 3

2

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

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

为什么是地图?

最初,它们易于使用且非常灵活,在进一步的开发中,它们可以轻松地交换为几乎与地图一样灵活的记录,但是:

  • 是实际的类/类型
  • 因此具有纯 Java 字段访问特性
  • 因此可以很好地使用协议/接口
  • 但几乎和地图一样灵活
  • 与各种解构很好地玩耍
  • 它们提供了一套实用功能,您不必自己实现
    • (map->LngLat {...})(从地图生成 LngLat)和
    • (apply ->LngLat [...])(从向量构造 LngLat)
    • 可能更多...
于 2015-08-18T12:58:32.760 回答
1

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

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

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

于 2015-08-18T12:59:57.013 回答
0

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

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

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

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

于 2015-08-18T13:12:55.100 回答