Groovy оператор распространения точек - PullRequest
12 голосов
/ 15 июня 2009

Я не уверен, когда именно мне нужно использовать оператор распространения точек. Если у меня есть список, такой как:

def animals = ['ant', 'buffalo', 'canary', 'dog']

Поскольку и animals, и члены списка имеют метод size (), то для того, чтобы метод вызывался для элементов списка (а не для самого списка), мне нужно использовать:

animals*.size()

вместо:

animals.size()

Однако рассмотрим следующее выражение, которое возвращает список имен методов, доступных в классе String

String.metaClass.methods.name

Как Groovy узнает (без использования оператора точки смещения), что я хочу, чтобы свойство name извлекалось из каждого элемента списка, возвращаемого String.metaClass.methods, а не из самого списка? Существует ли набор правил для использования в этом случае, например:

  • Если метод / свойство существует в List, вызывать его в List
  • В противном случае попробуйте вызвать его для каждого элемента списка

Спасибо, Дон

1 Ответ

10 голосов
/ 16 июня 2009

Краткий ответ: DefaultGroovyMethods добавляет метод "getAt" ко всем коллекциям , который выполняет итерацию по коллекции и собирает значение свойства для каждой из них.

Если вас интересует длинный ответ, я написал пост в блоге , в котором некоторое время назад подробно рассказывал о кроличьей норе в метаклассе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...