2016-10-04 41 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

感謝您的回答。我已經閱讀過文檔,但問題是爲什麼同一個操作符在一個用例中使用*而在另一個*:符號中。由於時髦往往會盡可能簡化事情,所以猜測一定有一個很好的理由。 –