2016-07-27 76 views
1

我的文檔和Closure.java引用看到的以「指令」沒有的whgat它或它是什麼解釋,什麼是,什麼是使用封閉「指令」

public static final int DONE = 1, SKIP = 2; 
private int directive; 
/** 
* @return Returns the directive. 
*/ 
public int getDirective() { 
    return directive; 
} 

/** 
* @param directive The directive to set. 
*/ 
public void setDirective(int directive) { 
    this.directive = directive; 
} 

我也用Google搜索,但我發現沒有一處提到它,除了從一些測試,它出現

assert directive = DONE 

,所以我唯一知道的是,它可以完成或跳過。

這有什麼「真實生活」的例子嗎?

回答

1

此指令屬性從常規運行中收集操作迴路斷開狀態內部使用 看到groovy.runtime.DefaultGroovyMethods.java在Groovy源代碼:

public static <T,E> Collection<T> collect(Collection<E> self, Collection<T> collector, @ClosureParams(FirstParam.FirstGenericType.class) Closure<? extends T> transform) { 
    for (E item : self) { 
     collector.add(transform.call(item)); 
     if (transform.getDirective() == Closure.DONE) { 
      break; 
     } 
    } 
    return collector; 
} 

它是通過訪問getter和setter getDirective()和setDirective()在groovy運行時 中,並通過指令屬性在腳本中關閉。

DONE用於停止收集操作

例如5後停止:

(1..10).collect { 
    if (it>= 5) directive = Closure.DONE; 
    new Tuple(it, (int)(it/2)) 
} 

Result: [[1, 0], [2, 1], [3, 1], [4, 2], [5, 2]] 

SKIP沒有使用......而且對聚集操作(無效果?)

這個功能聽起來有點像特殊情況下的一個竅門 它可能更好使用像find,findAll e TC。 如果可能的話

+0

這是非常好的,而且由於指令是INT我可以用我自己的指令來處理複雜的邏輯閉包中,像 '(1..10).collect { 如果(指令== 189){ 指令= 190 新的元組(它,(INT)(它/ 2)) }否則{ 指令= 189 新的元組(它,(INT)(它* 2)) } } ' 謝謝,我欣賞簡潔而明確的迴應。我們歡迎您來到我們的 – amsmota

+0

。 如果我是你我不會這麼做,太複雜和難以維護恕我直言...你會準備好自己在未來的辛苦時間 它是否與你發佈有關DSL的另一個問題有關? 如果是我有回覆提交,我開始研究一些DSL類工具和挖掘主題 – ARA