एक लाइन पर कई ऑब्जेक्ट घोषणाओं की जेनकिंस व्याख्या


9

यह एक सवाल नहीं है, बल्कि एक सावधानी की कहानी है: मैंने कुछ स्थान बचाने की कोशिश की और जेनकिंस घोषणात्मक पाइपलाइन में अपने चर को घोषित किया:

int a, b, c

फिर, मैंने उन्हें इस प्रकार शुरू किया:

a = b = c = 0

अपने कोड में, मैं इन पूर्णांकों का उपयोग एक लूप में काउंटर के रूप में करता हूं। मेरी पटकथा बार-बार असफल होती रही, कुछ अपवादों को फेंका गया:

java.lang.NullPointerException: Cannot invoke method next() on null object

और मुझे पता था कि मेरी सूची वैध है क्योंकि यह हार्ड-कोडेड थी। इसलिए, मैं सोचने लगा कि इन काउंटरों के साथ क्या हो रहा है और जब मैंने गेटक्लास () को फोन किया, तो जेनकिन्स ने मुझे खुशी से बताया कि वे पूर्णांक नहीं थे, बल्कि

org.codehaus.groovy.runtime.NullObject

कोड बदलने के बाद

int a = 0
int b = 0
int c = 0

सब कुछ एक आकर्षण की तरह काम करता था। बस इसे साझा करना चाहता था। शायद यह किसी को कुछ निराशा से बचाने में मदद करेगा।

जवाबों:


12

जेनकिंस पाइपलाइन ग्रूवी -सीपीएस दुभाषिया का उपयोग करके निरंतर-गुजर शैली में ग्रूवी कोड को निष्पादित करती है। यह वेनिला ग्रूवी नहीं है जिसे आप सीधे आईडीई या ग्रूवी शेल में निष्पादित कर सकते हैं।

ग्रूवी सीपीएस निरंतरता-गुजर शैली और सही ग्रूवी अभिव्यक्ति का समर्थन करने के लिए आपके कोड को बदल देता है:

a = b = c = 0

ऐसी चीज़ में तब्दील हो जाता है जो अधिक दिखती है:

eval(
  var("a"), 
  assign(
    eval(
      var("b"), 
      assign(
        eval(
          var("c"), 
          assign(0)
        )
      )
    )
  )
)

सीपीएस दुभाषिया में इस अभिव्यक्ति के साथ समस्या यह है कि असाइनमेंट किसी भी मूल्य को वापस नहीं करता है, और इस प्रकार nullमान चर को सौंपा जाता है b, और यही बात चर के लिए होती है a

यदि आप सीपीएस इनवोकेशन ब्लॉक में गहरी खुदाई करना चाहते हैं, तो आप ग्रूवी-सीपीएस परियोजना को क्लोन कर सकते हैं और com.cloudbees.groovy.cps.CpsTransformerTestकक्षा में एक साधारण परीक्षण केस लिख सकते हैं ।

@Test
void testMultiVariablesInlineCPS() {
    def cps = parseCps('''
int a, b, c
a = b = c = 0
''')
    println cps
}

तब आप println cpsडीबगर पर एक ब्रेकपॉइंट लगा सकते हैं और चला सकते हैं। जब आप निरीक्षण विंडो खोलते हैं, तो आपको इस चित्र के समान दिखाई देगा:

यहां छवि विवरण दर्ज करें

एक साइड नोट के रूप में, ध्यान रखें कि ग्रूवी कंपाइलर आपके सिंगल लाइन असाइनमेंट को भी बदल देता है जब कोड को बायटेकोड पर संकलित किया जाता है। यदि आप एक सरल ग्रूवी स्क्रिप्ट संकलित करते हैं जैसे:

int a, b, c
a = b = c = 0

println "$a $b $c"

और फिर आप IDE में अपनी कक्षा की फाइल को बाइटकोड को जावा समकक्ष के विघटित करने के लिए खोलते हैं, आपको कुछ इस तरह दिखाई देगा:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import groovy.lang.Binding;
import groovy.lang.Script;
import org.codehaus.groovy.runtime.GStringImpl;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.callsite.CallSite;

public class test extends Script {
    public test() {
        CallSite[] var1 = $getCallSiteArray();
    }

    public test(Binding context) {
        CallSite[] var2 = $getCallSiteArray();
        super(context);
    }

    public static void main(String... args) {
        CallSite[] var1 = $getCallSiteArray();
        var1[0].call(InvokerHelper.class, test.class, args);
    }

    public Object run() {
        CallSite[] var1 = $getCallSiteArray();
        int a = 0;
        int b = 0;
        int c = 0;
        byte var5 = 0;
        return var1[1].callCurrent(this, new GStringImpl(new Object[]{Integer.valueOf(var5), Integer.valueOf(var5), Integer.valueOf(var5)}, new String[]{"", " ", " ", ""}));
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.