2

char[]GroovyがaをaString内に変換する方法を理解しようとしています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 に答える