2

ant-contrib 中的 for/foreach 循环是否支持等效的“break”或“continue”语句?据我所知,他们没有。

有没有可行的变通办法?

谢谢-T

4

3 回答 3

4

没有简单的方法来实现此行为,但也许以下建议会有所帮助。

  • 使用for任务(即不是 foreach)
  • keepgoing属性设置为 true
  • 使用带有条件的fail任务,以便需要跳过的项目将失败。

每当您检测到需要中断时,您都可以通过定义属性来获得诸如中断之类的东西myBreakProperty

 <for list="a,b,c,d,e" param="letter" keepgoing="true">
    <sequential>
       <if>
         <equals arg1="@{letter}" arg2="c" />
       <then>
         <property name="myBreakProperty" value="nevermind the value"/>
       </then>
     </if>
     <fail if="myBreakProperty"/>
     <echo>Letter @{letter}</echo>
    </sequential>
 </for>

输出将是: Letter a Letter b


要获得类似continue的东西:

 <for list="a,b,c,d,e" param="letter" keepgoing="true">
    <sequential>
       <if>
         <equals arg1="@{letter}" arg2="c" />
       <then>
         <fail/>
       </then>
     </if>
     <echo>Letter @{letter}</echo>
    </sequential>
 </for>

输出将是: Letter a Letter b Letter d Letter e

于 2013-03-28T09:26:57.883 回答
1

您可以创建一个中断流程,而不会运行像失败这样苛刻的事情。使用属性来检测何时要中断,您可以实现如下所示:

<var name="break.flag" unset="true"/>

<for list="a,b,c,d,e" param="letter">
    <sequential>
        <if>
            <not>
                <isset property="break.flag"/>
            </not>
        <then>
            <if>
                <equals arg1="@{letter}" arg2="c" />
            <then>
                <property name="break.flag" value="true"/>
            </then>
            </if>

            <if>
                <not>
                    <isset property="break.flag"/>
                </not>
            <then>
                <echo>Letter @{letter}</echo>
                <echo>Do the rest of the loop here</echo>
            </then>
            </if>
        </then>
        </if>
    </sequential>
</for>
于 2015-06-11T23:28:34.380 回答
0

要真正打破循环,您可以将 fail 与 trycatch 一起使用

            <trycatch>
                <try>
                    <for param="i" begin="1" end="99">
                        <sequential>
                            ...
                            <fail message="break" />
                        </sequential>
                    </for>
                </try>
                <catch />
            </trycatch>
于 2021-01-03T19:45:40.470 回答