Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-分解数组与映射_Clojure_Clojurescript_Destructuring - Fatal编程技术网

Clojure-分解数组与映射

Clojure-分解数组与映射,clojure,clojurescript,destructuring,Clojure,Clojurescript,Destructuring,Clojure有一个非常好的解构语法,它适用于数组和映射 我经常混淆两者,这意味着我不确定该选择哪一个。什么时候应该使用贴图作为参数,什么时候应该使用数组 例如,我得到了以下数据,我想传递一个经度和一个纬度。我可以将其作为{:lat 12:lng 34}或[12 34]传递,也可以作为两个参数传递 注意:我不使用两个参数,因为我认为使用coords绑定更好 然后假设我想添加新字段(精度、高度、时间戳…),那么优势似乎就体现在地图上: 如果有更多的参数,数组的可读性似乎不太好(您必须查看原型才能

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

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

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

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

然后假设我想添加新字段(精度、高度、时间戳…),那么优势似乎就体现在地图上:

  • 如果有更多的参数,数组的可读性似乎不太好(您必须查看原型才能理解解构,从而了解所使用的参数)
  • 在地图中,我可以添加新字段,并以自描述性方式打印(键充当标签)
但是,我经常以一个大的
options
参数作为映射的函数结束,并带有一些不相关的子选项。它感觉有点臃肿,即使只有10个键

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

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

我想说,基于位置的数据结构,比如向量,很早就达到了极限。尤其是如果数据结构用于多个地方,并且更具“描述性”而非“列表性”

为什么是地图

最初,它们易于使用且非常灵活,在开发过程中,它们可以很容易地交换,几乎与地图一样灵活,但:

  • 是实际的类/类型
  • 因此具有纯java字段访问特性
  • 因此,可以很好地使用协议/接口
  • 但它们几乎和地图和地图一样灵活
  • 很好地处理各种解构
  • 它们提供了一套您不必自己实现的util函数
    • (地图->LngLat{…})
      (从地图生成LngLat)和
    • (应用->LngLat[…])
      (从向量构造LngLat)
    • 可能更多

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

在如何构造记录方面,您也有相当大的灵活性。可以使用矢量样式的位置参数,也可以将关键点作为贴图传入

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

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

(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