[英]Anonymous code blocks in Groovy
有没有办法在 Groovy 中使用匿名代码块? 例如,我正在尝试将以下 Java 代码转换为 Groovy:
{
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);
我能想到的最接近的翻译如下:
boolean groovyIsLame = true
if (groovyIsLame) {
int i = 0
println i
}
int i = 10
println i
我知道匿名代码块通常是一种反模式。 但是具有名称如“inputStream0”和“inputStream1”的变量也是一种反模式,因此对于我正在处理的这段代码,匿名代码块会有所帮助。
您可以在 Groovy 中使用匿名代码块,但这些代码块和闭包之间的语法不明确。 如果您尝试运行它,您实际上会收到此错误:
歧义表达式可以是无参数的闭包表达式,也可以是孤立的开放代码块; 解决方案:添加一个明确的闭包参数列表,例如{it -> ...},或者通过给它一个标签来强制将其视为一个开放块,例如 L:{...} at line: 1, column: 1
按照建议,您可以使用标签,它将允许您使用匿名代码块。 用 Groovy 重写 Java 代码:
l: {
int i = 0
println i
}
int i = 10
println i
1.times {
// I'm like a block.
}
关于什么:
({
int i = 0
println i
}).()
int i = 10
println i
我手头没有 Groovy 安装,但应该可以。
在 Groovy 中,这些大括号构成了一个闭包字面量。 所以,没有办法。 就个人而言,我会考虑放弃匿名块以获得非常好的关闭。
对匿名块的最常见需求是使用def
进行附加(可能隐藏)绑定。 一种选择是创建一个与绑定等效的字典并使用.with
。 使用问题中给出的示例:
[i:0].with {
println i
}
int i = 10
println i
这给了你一个 lisp 风格的let
块
为什么不添加if(true)
if(true) {
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.