我遇到了这段代码:
n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
它用于打印树形结构。像这样:
*
***
*****
*******
*
(对于n
= 4)
答案 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
对象,从n
到1
递减1。然后使用“Spread operator(*)”
2)any
方法在DefaultGroovyMethods
中定义,它是一个谓词函数,如果集合中的元素满足提供的谓词闭包,则返回true。在此示例中,代码不检查返回值,因此原始其他人可能使用each
调用生成相同的输出。