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