سؤال

أنا أحاول أن تعيين اثنين من سلاسل مختلفة إلى اثنين من المتغيرات المختلفة تعتمد على اثنين من القيم المنطقية في النمل.

شبة الكود (العش):

if(condition)
   if(property1 == null)
      property2 = string1;
      property3 = string2;
   else
      property2 = string2;
      property3 = string1;

ما حاولت ؛

<if>
  <and>
    <not><isset property="property1"/></not>
    <istrue value="${condition}" />
  </and>
  <then>
    <property name="property2" value="string1" />
    <property name="property3" value="string2" />
  </then>
  <else>
    <property name="property2" value="string2" />
    <property name="property3" value="string1" />
  </else>
</if>

ولكن يمكنني الحصول على مؤشر فارغة استثناء الخط التي تحتوي على "<if>".يمكنني الحصول على عمل باستخدام <condition property=...> الكلمات ولكن يمكن فقط تعيين خاصية واحدة في وقت واحد.حاولت استخدام <propertyset> لكن ذلك لم يكن يسمح أيضا.

أنا جديدة على النمل كما كنت قد خمنت ربما :).

غاف

هل كانت مفيدة؟

المحلول

وهناك عدة طرق للقيام بذلك. الأكثر مباشرة هو لمجرد استخدام بيانين condition، والاستفادة من ثبات الملكية:

<condition property="property2" value="string1">
    <isset property="property1"/>
</condition>
<condition property="property3" value="string2">
    <isset property="property1"/>
</condition>

<!-- Properties in ant are immutable, so the following assignments will only
     take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>

وهذه هي مرهقة بعض الشيء ولا مقياس جيد، ولكن لخصائص اثنين فقط أنا على الأرجح استخدام هذا النهج.

وهناك طريقة أفضل إلى حد ما هو استخدام مستهدفا مشروطا:

<target name="setProps" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="init" depends="setProps">
    <!-- Properties in ant are immutable, so the following assignments will only
         take place if property1 is *not* set. -->
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>

    <!-- Other init code -->
</target>

ونحن نتخذ مرة أخرى الاستفادة من ثبات الملكية هنا. إذا كنت لا تريد أن تفعل ذلك، يمكنك استخدام السمة unless، ومستوى إضافي من indirection:

<target name="-set-props-if-set" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="-set-props-if-not-set" unless="property1">
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>
</target>

<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/>

<target name="init" depends="setProps">
    <!-- Other init code -->
</target>

ومن المهم أن نلاحظ أن if وunless سمات target فقط معرفة ما اذا كان تم تعيين الخاصية، وليس قيمة العقار.

نصائح أخرى

يمكنك استخدام النمل-Contrib مكتبة الحصول على أنيق <if><then><else> بناء الجملة ، ومع ذلك فإنه يتطلب بضع تحميل/تثبيت الخطوات.

نرى هذا البعض حتى السؤال: النمل-contrib - إذا/إذن/آخر مهمة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top