Как работает любой метод в Groovy? - PullRequest
9 голосов
/ 11 декабря 2011

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

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? Doc мне мало помогает. Что такое прогноз, который можно передать в any (как указано в Doc )?

Какая польза от any и как с ней обращаться в этом случае?

Ответы [ 2 ]

11 голосов
/ 11 декабря 2011

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 возвращает ноль, поэтому any возвращает ложь.Это значение не используется и отбрасывается.

Единственная причина, по которой я могу подумать, что кто-то мог использовать any, это избегать просмотра возвращаемого значения each в консоли.each возвращает исходную коллекцию.

3 голосов
/ 11 декабря 2011

1) n..1 называется литералом диапазона, он создает объект groovy.lang.Range, который уменьшается на 1 с n до 1.Затем он объединяется с окружающим списочным контекстом с помощью « Оператор распространения (*)»

2), метод any определен в DefaultGroovyMethods и это функция предиката, которая возвращает true, если элемент в коллекции удовлетворяет предоставленному закрытию предиката.В этом примере код не проверяет возвращаемое значение, поэтому исходный код мог получить тот же вывод, используя вместо этого вызов each.

...