Как Groovy переводит из char [] в String в GString? - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь выяснить, как Groovy переводит char[] в String в GString.

Пример:

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

Результат:

pass

Сначала я предполагал, что он будет использовать метод toString () для char [] (http://groovy.codehaus.org/groovy-jdk/primitive-types/char[].html#toString()). Но результаты выполнения следующего кода, похоже, указывают на обратное:

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

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

println pchar.toString()
println "$pchar"

Результат:

pass

****

pass

Я также попытался переопределить 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"

Результат:

pass

Метод вызывается в классе [C: toString, []

****

pass

Кто-нибудь знает, какGroovy делает это преобразование?

1 Ответ

9 голосов
/ 09 февраля 2012

При просмотре источника может показаться, что соответствующая строка находится в источнике .При создании экземпляра GString он создает объект [] со значениями, которые можно увидеть, если вы получите свойство values ​​на GString:

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

В источнике GString он в конечном итоге передает значение объекта (char[]) в метод InvokerHelper write (), который передает значение в toString (объект).В методе toString () вы обнаружите, что он не соответствует критериям, и, наконец, передаете его в метод format (), где в строке в источнике он проверяет, является ли аргумент массивом char, а затем создает новыйСтрока из массива char.

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