2012-02-08 163 views
2

我想弄清楚Groovy如何將char[]轉換爲GString內的StringGroovy如何從char []轉換爲GString中的字符串?

實施例:

char[] pchar = ['p', 'a', 's', 's'] 
println "$pchar" 

結果:

起初我假定它將使用toString()方法對char [](HTTP://groovy.codehaus .ORG/Groovy的JDK /原語類型/焦炭[]。HTML#的toString())。但在運行下面的代碼的結果似乎並非如此:

char[] pchar = ['p', 'a', 's', 's'] 
println "$pchar" 

pchar.class.metaClass.toString = {-> 
    "****" 
} 

println pchar.toString() 
println "$pchar" 

結果:

****

我我也嘗試覆蓋invokeMethod()來嘗試搞清楚它無濟於事:

char[] pchar = ['p', 'a', 's', 's'] 
println "$pchar" 

pchar.class.metaClass.toString = {-> 
    "****" 
} 
pchar.class.metaClass.invokeMethod = {String methodName, Object arguments -> 
    println("Method called on ${delegate.class}: $methodName, $arguments") 
    def metaMethod = delegate.metaClass.getMetaMethod(methodName) 
    return metaMethod.invoke(delegate, arguments) 
} 

println pchar.toString() 
println "$pchar" 

結果:

方法稱爲上類[C:的toString,[]

****

通過

有誰知道Groovy如何進行這種轉換?

回答

9

瀏覽源代碼時,會出現相關的line is in the source。當實例化的GString,它創建一個Object [值]如果你上了GString的價值屬性,你可以看到:

char[] pchar = ['p', 'a', 's', 's'] 
pchar.values // [pass] 

在GString的來源,它最終傳遞對象值(的char [] )傳遞給InvokerHelper write()方法,該方法將值傳遞給toString(object)。在toString()方法中,您會發現它與條件不匹配,最後將其傳遞給format()方法,在源代碼行檢查參數是否是char數組,然後創建一個新的來自char數組的字符串。

if (arguments.getClass().isArray()) { 
     if (arguments instanceof char[]) { 
      return new String((char[]) arguments); 
     } 
     return format(DefaultTypeTransformation.asCollection(arguments), verbose, maxSize); 
    }