Groovy点阵运算符

Dón*_*nal 13 groovy

我不确定何时需要使用spread-dot运算符.如果我有一个列表,如:

def animals = ['ant', 'buffalo', 'canary', 'dog']
Run Code Online (Sandbox Code Playgroud)

因为这两个animals和列表的成员都有一个size()方法,那么为了在列表的元素(而不是列表本身)上调用该方法,我需要使用:

animals*.size()
Run Code Online (Sandbox Code Playgroud)

而不是:

animals.size()
Run Code Online (Sandbox Code Playgroud)

但是,请考虑以下表达式,该表达式返回String类上可用的方法名称列表

String.metaClass.methods.name
Run Code Online (Sandbox Code Playgroud)

Groovy如何知道(不使用spread-dot运算符)我希望name从返回的列表的每个元素中检索属性String.metaClass.methods,而不是列表本身?在这种情况下是否有一套规则可供使用,例如:

  • 如果List上存在方法/属性,则在List上调用它
  • 否则尝试为List的每个元素调用它

谢谢,唐

Ted*_*eid 10

简短的回答是,DefaultGroovyMethods为所有迭代通过Collection的集合添加了一个"getAt"方法,并为每个集合收集属性值.

如果你对这个很长的答案感兴趣的话,我写了一篇博文,不久前在这个确切的话题上潜入了metaClass的兔子洞.