含Switch Statement的函数返回数组时变量b为null问题求解
根因分析
- 核心问题是
switch结构的语法使用错误:
Groovy的switch匹配逻辑是:将switch(变量)括号内的变量值,与每个case 表达式的返回值做相等性判断,相等才会命中对应分支。
你在处理Destination的switch中传入的是字符串类型的Destination,但所有case后的表达式返回的都是布尔值(true/false),字符串和布尔值永远不可能相等,因此所有分支都没有命中,TO_URL从未被赋值,保持初始的null值,也就是你返回的第二个变量b。 - 变量
a正常返回的原因:
处理Source的switch也犯了同样的语法错误,但因为你写了default兜底分支,哪怕前面的case全部没命中,default也会给FROM_URL赋值,因此a一直能正常拿到值。 - 额外的语法错误:
第一个分支中Destination.startsWith("DPDHLPA"|"reference")写法错误,Groovy不能用|直接匹配多个前缀,需要拆成两个独立的判断。
修复方案
方案1:修正switch写法(适配多条件判断场景)
将switch的传入值改为true,即可匹配返回true的case条件,同时修正多前缀判断逻辑:
def BuildURL(Source, Destination, CopyToEverywhere) { def FROM_URL def TO_URL // 改成switch(true)匹配布尔类型的case条件 switch(true) { case (CopyToEverywhere && (Destination.startsWith("DPDHLPA") || Destination.startsWith("reference"))): TO_URL = ["https://${Destination}-something.com", "https://${Destination}-url.com"] break; case Destination.contains("author"): TO_URL = ["https://${Destination}-something.com"] break; case Destination.contains("publish"): TO_URL = ["https://${Destination}-url.com"] break; } // Source的switch也同步修正写法 switch(true) { case Source.contains("author"): FROM_URL = "https://${Source}-something.com" break; case Source.contains("publish"): // 注意原代码这里多写了一个横杠,已修正为单横杠,可按需调整 FROM_URL = "https://${Source}-url.com" break; default: FROM_URL = "https://${Source}-something.com" break; } println FROM_URL println TO_URL return [FROM_URL, TO_URL] } def CopyToBothInstances = false (a, b) = BuildURL('source-author', 'dest-publish', CopyToBothInstances ) println a println b
方案2:改用if-else分支(逻辑更直观,不容易出匹配错误)
当前场景用if-else层级判断更简单,不需要纠结switch的匹配规则:
def BuildURL(Source, Destination, CopyToEverywhere) { def FROM_URL def TO_URL if (CopyToEverywhere && (Destination.startsWith("DPDHLPA") || Destination.startsWith("reference"))) { TO_URL = ["https://${Destination}-something.com", "https://${Destination}-url.com"] } else if (Destination.contains("author")) { TO_URL = ["https://${Destination}-something.com"] } else if (Destination.contains("publish")) { TO_URL = ["https://${Destination}-url.com"] } if (Source.contains("publish")) { FROM_URL = "https://${Source}-url.com" } else { FROM_URL = "https://${Source}-something.com" } println FROM_URL println TO_URL return [FROM_URL, TO_URL] }
修复后调用你给出的测试参数,b会返回["https://dest-publish-url.com"],符合预期。
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

