簡體   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