2

我试图弄清楚 Groovy 如何将 a 转换char[]为 aString内的 a GString

例子:

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

结果:

经过

起初我以为它会在 char[] (http://groovy.codehaus.org/groovy-jdk/primitive-types/char[].html#toString()) 上使用 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 是如何进行这种转换的?

4

2 回答 2

9

浏览源代码,相关行似乎在源代码中。实例化 GString 时,它会创建一个 Object[] 值,如果您获得 GString 上的 values 属性,您可以看到这些值:

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);
    }
于 2012-02-08T20:57:05.293 回答
0
char[] pchar = ['p', 'a', 's', 's']
assert pchar.join() == 'pass'
println "${pchar.join()}"
于 2022-02-24T11:35:13.307 回答