Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy spread-dot operator

Tags:

groovy

I'm unsure about when exactly I need to use the spread-dot operator. If I have a list such as:

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

Because both animals and the members of the list have a size() method, then in order to have the method invoked on the elements of the list (rather than the list itself), I need to use:

animals*.size()

rather than:

animals.size()

However, consider the following expression which returns a list of the method names that are available on the String class

String.metaClass.methods.name

How does Groovy know (without using the spread-dot operator) that I want the name property to be retrieved from each element of the list returned by String.metaClass.methods, rather than the list itself? Is there a set of rules to use in this case such as:

  • If method/property exists on List, invoke it on List
  • Otherwise try to invoke it for each element of List

Thanks, Don

like image 721
Dónal Avatar asked Jun 15 '09 17:06

Dónal


People also ask

What does =~ mean in Groovy?

the return type of =~ is a Matcher.

What is spread operator?

The spread operator is a new addition to the set of operators in JavaScript ES6. It takes in an iterable (e.g an array) and expands it into individual elements. The spread operator is commonly used to make shallow copies of JS objects. Using this operator makes the code concise and enhances its readability.


1 Answers

The short answer is that DefaultGroovyMethods adds a "getAt" method to all Collections that iterates through the Collection and collects the property value for each.

If you're interested in the long answer, I wrote up a blog post that dives down the metaClass rabbit hole on this exact topic a while ago.

like image 61
Ted Naleid Avatar answered Sep 21 '22 15:09

Ted Naleid