Как работает любой метод в Groovy?
я наткнулся на этот кусок кода:
n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
он используется для печати древовидной формы структуры. Вот так:
*
***
*****
*******
*
(для n=4)
как работает код
[*n..1,n]производства[4, 3, 2, 1, 4]?как
anyздесь работает метод? The Doc мне это не очень помогает. Что такое предсказание, которое можно передатьany(как указано в DocС)?
как использовать any а как ее обрабатывали в этом случае?
2 ответов
Q1a: * "распаковывает" массив. .. создает диапазон. [] создает коллекцию.
Q1b: *n..1 распаковывается [4,3,2,1] на отдельные части.
Q1c: [4,3,2,1,n] ==[4,3,2,1,4]
Q2: я не знаю, почему any здесь был использован; each работает так же хорошо, и больше смысла в контексте. any тут петля над соединением, так что println функции побочного эффекта как запланировано.
обычно any будет использоваться для определите, соответствуют ли какие-либо элементы коллекции критериям, например:
[*n..1,n].any { it > 10 } // Returns false, no elements are > 10
[*n..1,n].any { it == 3 } // Returns true, because at least one element is 3
последний оператор закрытия используется для определения, соответствует ли каждый элемент критериям. println возвращает null, so any возвращает false. Значение не используется и выкидывается.
единственная причина я могу думать, что кто-то мог использовать any чтобы не видеть возвращаемое значение each в консоли. each возвращает исходную коллекцию.
1) n..1 называется литералом диапазона, он создает groovy.lang.Range объект, который уменьшается на 1 от n to 1. Это затем объединяется в окружающий контекст списка с помощью"распространение оператор ( * )"
2) any метод определен в DefaultGroovyMethods и это функция предиката, которая возвращает true, если элемент в коллекции удовлетворяет поставленному замыканию предиката. В этом примере код не проверьте возвращаемое значение, чтобы оригинальный другой мог получить тот же результат, используя each звонок.