中断还是继续实施?

时间:2013-03-28 00:51:29

标签: ant ant-contrib

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

有没有可行的解决方法?

由于 -T

3 个答案:

答案 0 :(得分:4)

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

  • 使用for task(即不是foreach)
  • keepgoing属性设置为true
  • fail task与条件一起使用,以便需要跳过的项目失败。

通过在检测到需要中断时定义属性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


获取类似继续

的内容
 <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

答案 1 :(得分: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>

答案 2 :(得分:0)

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

            <trycatch>
                <try>
                    <for param="i" begin="1" end="99">
                        <sequential>
                            ...
                            <fail message="break" />
                        </sequential>
                    </for>
                </try>
                <catch />
            </trycatch>