2014-02-12 32 views
1

In Groovy,我有一個返回三元組的函數。 我想:使用Map的值而不是Groovy的變量進行多次賦值

  • Map返回的第一個值的任意鍵,
  • 分配其他兩個變量賦值。

我可以這樣做:

Map m = [:] 
(day, month, year) = "12 February 2014".split(" "); 
m["day"] = day; 

但我想擺脫變量day的,就像這樣:

Map m = [:] 
(m["day"], month, year) = "12 February 2014".split(" "); 

出於某種原因,這似乎是不可能。這是編譯器提醒我的:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
/web/com/139223923319646/main.groovy: 2: expecting ')', found ',' @ line 2, column 10. 
    (m["day"], month, year) = "12 February 2014".split(" "); 
      ^

你們能否幫我解釋一下爲什麼這個語法不能用?

+1

看到這個頁面http底部:/ /groovy.codehaus.org/Multiple+Assignment - 他們並沒有完全說出爲什麼,除了只使用'簡單變量,這意味着你的地圖不是'簡單'的對象。更多的熟練掌握Groovy的人(或許是Tim Yates!)或許能填補空白。 – mikemil

回答

2

你可以這樣做:

def dstr = "12 February 2014" 
def m = [['day', 'month', 'year'], dstr.split(" ")].transpose() 
                .collectEntries() 

要獲得

assert m == [ day:'12', month:'February', year:'2014' ] 

但我不知道這是你想要的...

2

根據multiple assignment Groovy documentation,這是不可能的。

當前只有簡單變量可以是多個 賦值表達式的目標,例如,如果你有名字 和姓氏領域的人類,目前還無法做到這一點:

(p.firstname, p.lastname) = "My name".split() 

你的第一個例子是目前做到這一點的最好辦法。

+0

哎呀,似乎我自己找不到那些信息!對不起,感謝您的回覆;) – ccjmne