9

我遇到了这段代码:

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工作?医生对我帮助不大。什么是可以传递的预测any(如Doc中所述)?

在这种情况下它的用途any和处理方式是什么?

4

2 回答 2

11

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返回原始集合。

于 2011-12-11T17:48:36.263 回答
3

1)n..1称为范围文字,它创建一个从togroovy.lang.Range减 1 的对象。然后使用“扩展运算符(*)”将其合并到周围的列表上下文中n1

2) 该any方法定义在DefaultGroovyMethods并且它是一个谓词函数,如果集合中的元素满足提供的谓词闭包,则返回 true。在这个例子中,代码不检查返回值,所以原来的其他代码可以使用each调用来产生相同的输出。

于 2011-12-11T17:47:47.043 回答