You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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会把集合当成单个参数处理,不会展开。

逐个分析代码行

  1. 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一致。

  2. 1b和2b行(传toString()后的字符串)
    调用range.toString()后,得到的是单个字符串对象"1..5",printf会把它当成一个完整参数匹配%s,因此能完整打印出Range的内容。2b行的List调用toString()后,同样会生成单个字符串,自然能被完整打印。

  3. 1c和2c行(多传一个空字符串参数)
    这里在Range/List后面多传了一个空字符串"",Groovy不会再展开前面的集合,而是把Range/List当成单个参数传给printf。%s会自动调用这个集合对象的toString方法,因此能完整打印出1..5。

内容的提问来源于stack exchange,提问作者Wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:13:26