Как работает любой метод в 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
звонок.