Как работает любой метод в Groovy?

я наткнулся на этот кусок кода:

n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }

он используется для печати древовидной формы структуры. Вот так:

    *
   ***
  *****
 *******
    *

(для n=4)

  1. как работает код [*n..1,n] производства [4, 3, 2, 1, 4]?

  2. как 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 звонок.