2013-05-27 67 views
1

有沒有人可以解釋我,這段代碼是如何工作的?Groovy - 關閉 - 讀取CSV

class CSVParser { 
    static def parseCSV(file,closure) { 
     def lineCount = 0 
     file.eachLine() { line -> 
      def field = line.tokenize(",") 
      lineCount++ 
      closure(lineCount,field) 
     } 
    } 
} 

use(CSVParser.class) { 
    File file = new File("test.csv") 
    file.parseCSV { index,field -> 
     println "row: ${index} | ${field[0]} ${field[1]} ${field[2]}" 
    } 
} 

鏈接:http://groovy-almanac.org/csv-parser-with-groovy-categories/

「parseCSV」 看起來就像一個方法,但在 「文件」 的封閉使用。 Closure是「parseCSV」參數之一,最容易混淆 - 在這個方法中,只有closure(lineCount,field)沒有任何內部功能。

它如何與file.parseCSVuse(CSVParser.class)上的關閉一起工作?

回答

2

這是一個Category;簡單地說,他們使一個方法從一個類「成爲」第一個參數對象的方法。作爲參數傳遞的閉包不會添加到示例中;它可能是一個字符串或其他任何東西:

class Category { 
    // the method "up()" will be added to the String class 
    static String up(String str) { 
    str.toUpperCase() 
    } 

    // the method "mult(Integer)" will be added to the String class 
    static String mult(String str, Integer times) { 
    str * times 
    } 

    // the method "conditionalUpper(Closure)" will be added to the String class 
    static String conditionalUpper(String str, Closure condition) { 
    String ret = "" 
    for (int i = 0; i < str.size(); i++) { 
     char c = str[i] 
     ret += condition(i) ? c.toUpperCase() : c 
    } 
    ret 
    } 
} 

use (Category) { 
    assert "aaa".up() == "AAA" 
    assert "aaa".mult(4) == "aaaaaaaaaaaa" 
    assert "aaaaaa".conditionalUpper({ Integer i -> i % 2 != 0}) == "aAaAaA" 
} 

而且那是多麼Groovy Extensions工作