繁体   English   中英

Groovy 中的匿名代码块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM