2016-10-04 452 views
0

我想知道为什么这个语法对于传播列表和映射不一致。例如,在这个代码Groovy使用冒号分布运算符映射语法

def list =[1,2,3] 
def map =[a:1,b:2] 
println "${[*list]}" 
println "${[*:map]}" 

列表铺展单*,并与*地图:

它是连接到如何传播运营商内部工作?因为没有看到* map构造的任何其他用法(就像使用[:]定义空映射将它与列表区分开来一样)。

+0

'*:'只是一个运营商,像'*'或'?:'或'+'......它与内部的工作方式没有关系,它只是运营商传播地图的_“名称” –

回答

1

传播运算符(*)用于从集合中提取条目并将它们作为单个条目提供。

1.扩频列表元素:

当文字列表内所使用的,操作者传播充当如果传播元件内容物内联到列表:

def items = [4,5]    
def list = [1,2,3,*items,6]    
assert list == [1,2,3,4,5,6] 

来源:http://docs.groovy-lang.org/latest/html/documentation/#_spread_list_elements

2.传播地图元素:

传播地图运算符的工作方式与传播列表运算符类似,但是对于地图。它可以让你的地图内容内嵌到另一个地图的文字,像下面的例子:

def m1 = [c:3, d:4]   
def map = [a:1, b:2, *:m1] 
assert map == [a:1, b:2, c:3, d:4]​ 

来源:http://docs.groovy-lang.org/latest/html/documentation/#_spread_map_elements

+0

我发现等效语法'def map = [a:1,b :2] + m1'更具可读性 –

+1

是的,我也是,但@Vuk要求'*:'的意义,所以我给了他一个例子。 –

+0

感谢您的回答。我已经阅读过文档,但问题是为什么同一个操作符在一个用例中使用*而在另一个*:符号中。由于时髦往往会尽可能简化事情,所以猜测一定有一个很好的理由。 –