2015-09-10 25 views
2

我在那裏在線製作一個Groovy教程,在玩過代碼後,我觀察到一些我無法理解的行爲。Groovy:使用eachWithIndex方法觀察到的不同行爲

首先,我創建了一個Map對象是這樣的:

def devMap = [:] 
devMap = ['name':'Frankie', 'framework':'Grails', 'language':'Groovy'] 
devMap.put('lastName','Hollywood') 

然後我打電話eachWithIndex打印出來的值,就像這樣:

devMap.eachWithIndex { println "$it.key: $it.value"} 

打印了這個控制檯:

name: Frankie 
framework: Grails 
language: Groovy 
lastName: Hollywood 

但是當我從eachWithIndex我打印到控制檯THOD這樣使用箭頭操作:

devMap.eachWithIndex { it, i -> println "$i: $it" } 

下得到打印到控制檯:

0: name=Frankie 
1: framework=Grails 
2: language=Groovy 
3: lastName=Hollywood 

所以,我能不明白是爲什麼指標得到了印有第二個語句,以及爲什麼有=符號,但沒有:鍵值對之間的符號?

謝謝。

+1

索引打印是因爲您告訴代碼打印它:「$ i」是索引。 – Jkike

+0

我認爲這是原因。任何關於等號的想法? – Celt

+1

它是使用equals打印的Map.Entry類的toString()。 – Jkike

回答

2

當您使用eachWithIndex的無參數版本時,it是地圖中的當前條目。這意味着it.keyit.value會返回您所期望的。

當您使用eachWithIndex的兩個參數版本時,it是當前的映射條目,i是當前索引。你打印i,索引,然後因爲你只打印it,你得到的it.toString()的結果,格式化映射條目爲"${it.key}=${it.value}"

+0

感謝您的解釋! – Celt

1

你的第二個例子是等價於:

devMap.eachWithIndex { it, index -> println "$index: ${it.toString()}" } 

其中這表明toString()實現使用=語法:

devMap.each { println it.toString() } 

注意,這是更接近你的目標(我把它解釋):

devMap.eachWithIndex { it, index -> println "$index: ${it.key}: ${it.value}" } 
+0

感謝您的回答! – Celt