Groovy中的任何方法如何工作?

时间:2011-12-11 17:12:52

标签: groovy jvm-languages

我遇到了这段代码:

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中所述)?

  3. 使用any以及在这种情况下如何处理?

2 个答案:

答案 0 :(得分:10)

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,因此any将返回false。该值未使用并被丢弃。

我能想到有人可能使用any的唯一原因是避免在控制台中看到each的返回值。 each会返回原始集合。

答案 1 :(得分:3)

1)n..1被称为范围文字,它创建一个groovy.lang.Range对象,从n1递减1。然后使用“Spread operator(*)”

将其合并到周围的列表上下文中

2)any方法在DefaultGroovyMethods中定义,它是一个谓词函数,如果集合中的元素满足提供的谓词闭包,则返回true。在此示例中,代码不检查返回值,因此原始其他人可能使用each调用生成相同的输出。