2011-08-31 60 views
3

我有字符串類似這樣的哈希:帶點字符串性能

Map map = ['a.b.c': 'Hi'] 

...我需要的gradle中使用擴展這樣的表達式:

This is a greeting: ${a.b.c} 

如果我在擴展時使用gradle copy任務,我會收到一條錯誤消息'沒有這樣的屬性:a'。

有沒有什麼辦法讓gradle產出/常規該地圖轉換成我需要解決的屬性?

回答

0

我不確定你的需求是什麼,但是如果你只需要替換財產狀的標記,並且不需要Groovy模板的全部功能,filter()方法與Ant的ReplaceTokens類相結合就更安全了(和更快)下注比expand()。請參閱Gradle用戶指南中的Filtering files

+0

過濾器不接受multichar令牌。然而,最終擴大工作的麻煩,超過了更換所有令牌的麻煩。 – thoredge

1

我不知道什麼搖籃,但也許這將幫助....

如果你有一個地圖

Map map = ['a.b.c': 'Hi'] 

那麼你就不能檢索使用

值「嗨」
map.a.b.c 

相反,你必須使用:

map.'a.b.c' 

map['a.b.c'] 
+0

是;這是我原來的問題。但是,我認爲這是一個常見問題,有解決方案;可能是建築者的形式。 – thoredge

2

我無法找到一個內置的答案,但在這裏是一個可以被用來作爲地圖元方法去做你想做的一個完整的,自包含的方法:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy'] 

Map.metaClass.expandKeys = { separator = '.' -> 
    def mergeMaps = { a, b -> 
     b.each{ k, v -> 
      if(a[k] && (v instanceof Map)) { 
       mergeMaps(a[k], v) 
      } else { 
       a[k] = v 
      } 
     } 
     a 
    } 
    delegate.inject([:]){ result, k, v -> 
     mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] }) 
    } 
} 

assert map.expandKeys() == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]] 

它還允許不同的分離比.,只是通過分隔成expandKeys方法

如果你想使用它像一個正常的功能,那麼你就可以做到這一點,而不是:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy'] 

def expandKeys = { Map input, separator = '.' -> 
    def mergeMaps = { a, b -> 
     b.each{ k, v -> 
      if(a[k] && (v instanceof Map)) { 
       mergeMaps(a[k], v) 
      } else { 
       a[k] = v 
      } 
     } 
     a 
    } 
    input.inject([:]){ result, k, v -> 
     mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] }) 
    } 
} 

assert expandKeys(map) == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]] 

主要的竅門,除了合併地圖,是分裂然後反轉每個鍵。然後最後的層次結構可以向後建立。此外,可能有更好的方式來處理合並,因爲我不喜歡末尾掛着a

+0

我忘了提及,如果您的原始地圖包含子地圖作爲值,則此示例可能無法按您期望的方式工作。 (它們將被合併,而不是保持原樣。)解決方案是一個更復雜的函數,它在對字符串進行標記時進行合併。即使那樣,你*可能會在子地圖上遇到一些問題。 – OverZealous

+0

我在運行Gradle或Groovysh內遇到了一些麻煩。我得到了錯誤'groovy.lang.MissingPropertyException'。由於併發症(即你不能同時擁有a和a.b),我決定不這樣做。 – thoredge

+0

好的和工作的解決方案+1 – zellus