জেনকিন্স এক লাইনে একাধিক বস্তুর ঘোষণার ব্যাখ্যা


9

এটি কোনও প্রশ্ন নয়, বরং একটি সাবধানতার কাহিনী: আমি কিছু জায়গা বাঁচানোর চেষ্টা করেছি এবং জেনকিন্স ডিক্লারেটিভ পাইপলাইনে আমার ভেরিয়েবলগুলি ঘোষণা করেছিলাম:

int a, b, c

তারপরে, আমি এগুলি তাদের সূচনা করেছিলাম:

a = b = c = 0

আমার কোডে, আমি এই পূর্ণসংখ্যাগুলি একটি লুপে কাউন্টার হিসাবে ব্যবহার করি। আমার স্ক্রিপ্ট বার বার ব্যর্থ হতে থাকে, কিছু ব্যতিক্রম ছুঁড়ে দেওয়া:

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

এবং আমি নিশ্চিতভাবে জানতাম যে আমার তালিকাটি কার্যকর কোডড হওয়ার কারণে এটি বৈধ। সুতরাং, আমি এই কাউন্টারগুলিতে কী ঘটছে তা ভাবতে শুরু করি এবং যখন আমি তাদের উপর getClass () কল করি তখন জেনকিনস আমাকে খুশিতে বলেছিল যে তারা পূর্ণসংখ্যা নয়, বরং

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"

এবং তারপরে আপনি জাভা সমমানের বাইটোকডটি ছিন্ন করতে আইডিইতে এর শ্রেণি ফাইলটি খুলুন, আপনি এরকম কিছু দেখতে পাবেন:

//
// 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[]{"", " ", " ", ""}));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.