我遇到了这段代码:
n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
它用于打印树形结构。像这样:
*
***
*****
*******
*
(对于n
=4)
在这种情况下它的用途any
和处理方式是什么?
我遇到了这段代码:
n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
它用于打印树形结构。像这样:
*
***
*****
*******
*
(对于n
=4)
在这种情况下它的用途any
和处理方式是什么?
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)n..1
称为范围文字,它创建一个从togroovy.lang.Range
减 1 的对象。然后使用“扩展运算符(*)”将其合并到周围的列表上下文中n
1
2) 该any
方法定义在DefaultGroovyMethods
并且它是一个谓词函数,如果集合中的元素满足提供的谓词闭包,则返回 true。在这个例子中,代码不检查返回值,所以原来的其他代码可以使用each
调用来产生相同的输出。