Groovy Power Print

Groovy имеет силу утверждать, но я бы хотел распечатать мощность. Например,

def foo = 'banna5', monkey=7, x=70
println "foo=$foo, monkey=$monkey, x/2=${x/2}"

См. повторяющиеся foo, обезьяна и выражение в строке println... что я хочу напечатать, это,

pprint foo, monkey, x/2

Это результат, который я ожидаю (от println или pprintln),

foo=banna5, monkey=7, x/2=35

Есть ли что-то, что делает это уже?

Ответ 1

В Groovy... ничего не делает, что вы хотите...

Проблема заключается в получении имен переменных при печати значений.

То, как это делает powerrassert, заключается в использовании АСТ манипуляции байт-кода (см. строка 947 класса org.codehaus.groovy.classgen.AsmClassGenerator) для украшения метода assert несколькими классами внутри пакета org.codehaus.groovy.runtime.powerassert.

Таким образом, чтобы получить нужные вам результаты, нужно будет добавить что-то подобное для управления АСТ аналогичным образом.

Вы можете добавить новую проблему с функцией проект JIRA, и вы никогда не знаете... это может привести к будущим версиям Groovy

Но на данный момент я думаю, что вы застряли с вашим println, поскольку у вас есть над ним

Ответ 2

Это может работать или не работать для вас. Очень возможно, что он работает только в скриптах.

def pprint(def varClosure) {
    s=varClosure()
    print("\"$s\" = " + binding.variables[s])
}

test = 15

pprint{"test"}

Я использовал закрытие, чтобы передать текущий контекст (чтобы получить привязки). Вы можете выполнять итерацию по закрытию различными способами - например, если вы передадите pprint {[ "test", "anotherVar" ]}, вы можете использовать это вместо println:

s.each() { print("\"$it\" = ${binding.variables[s]},\t") }
println ""

Это будет очень близко к желаемым результатам.

Если вы хотите сделать это с классом groovy, хеш привязок не существует. Существует хэш свойств, но он только обращается к свойствам объекта (не все переменные доступны для закрытия, другими словами, он пропускает переменные, определенные в методе и параметрах).

Возможно, закрытие имеет хэш всех доступных ему свойств - это было бы прекрасно. Я посмотрю более подробно.

Также существует метод dump() на объекте, который вам может понравиться.