咨询Groovy中Range与List无法完整打印的原因
Groovy中printf打印Range不完整的原因
先回顾测试代码和输出:
测试脚本:
println GroovySystem.version def range = 1..5 printf "1a: range %s %n", range printf "1b: range %s %n", range.toString() printf "1c: range %s %n", range, "" printf "2a: range %s %n", range.asList() printf "2b: range %s %n", range.asList().toString() printf "2c: range %s %n", range.asList(), ""
输出结果:
3.0.9 1a: range 1 1b: range 1..5 1c: range 1..5 2a: range 1 2b: range 1..5 2c: range 1..5
核心原因:Groovy对printf可变参数的特殊处理
Groovy的printf方法在处理集合类参数(比如Range、List)时,有特殊的行为规则:
- 当集合是唯一的可变参数时,Groovy会自动把集合展开成多个独立参数。
- 当集合后面还有其他参数时,Groovy会把集合当成单个参数处理,不会展开。
逐个分析代码行
1a和2a行(只传Range/List作为参数)
printf "1a: range %s %n", range中,range是唯一的可变参数,Groovy会把它展开成1,2,3,4,5这5个独立参数。但格式字符串只有一个%s占位符,只会匹配第一个元素1,剩下的元素没有对应占位符,因此不会被打印,最终只输出1。2a行的range.asList()是List对象,同样会被展开,结果和1a一致。1b和2b行(传toString()后的字符串)
调用range.toString()后,得到的是单个字符串对象"1..5",printf会把它当成一个完整参数匹配%s,因此能完整打印出Range的内容。2b行的List调用toString()后,同样会生成单个字符串,自然能被完整打印。1c和2c行(多传一个空字符串参数)
这里在Range/List后面多传了一个空字符串"",Groovy不会再展开前面的集合,而是把Range/List当成单个参数传给printf。%s会自动调用这个集合对象的toString方法,因此能完整打印出1..5。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

