গ্রোভিতে আমি কীভাবে বিশ্বব্যাপী ভেরিয়েবলগুলি তৈরি এবং অ্যাক্সেস করব?


128

আমাকে একটি পদ্ধতিতে একটি ভেরিয়েবলের একটি মান সংরক্ষণ করতে হবে এবং তারপরে সেই মানটি অন্য ভেরিয়েবল থেকে অন্য পদ্ধতিতে বা বন্ধ করার জন্য আমাকে ব্যবহার করতে হবে। আমি এই মানটি কীভাবে ভাগ করতে পারি?

উত্তর:


206

গ্রোভির স্ক্রিপ্টে স্কোপিং প্রত্যাশার চেয়ে আলাদা হতে পারে। এর কারণ এটি একটি গ্রোভি স্ক্রিপ্ট নিজেই এমন একটি ক্লাস যা একটি পদ্ধতি চালায় যা কোড চালায়, তবে এটি রানটাইম সম্পন্ন হয়। টাইপ সংজ্ঞা বাদ দিয়ে বা গ্রোভি ১.৮ এ আমরা @ ফিল্ড টীকা যুক্ত করতে পারি স্ক্রিপ্টে স্কোপ করার জন্য আমরা একটি পরিবর্তনশীলকে সংজ্ঞায়িত করতে পারি।

import groovy.transform.Field

var1 = 'var1'
@Field String var2 = 'var2'
def var3 = 'var3'

void printVars() {
    println var1
    println var2
    println var3 // This won't work, because not in script scope.
}

35
ফিল্ডটি কেবল একটি আমদানির প্রয়োজনীয়তাটি লক্ষ করুন .. আমদানি করুন groovy.transform.Field
খাইলো

মজাদার প্রথম লাইনের চেয়ে পরিবর্তে এডিট করার চেষ্টা করেছিল, এসও একটি ছয়-চর সম্পাদনা চায়!
জিমলহসে

1
আপনি যদি শ্রেণীর সংজ্ঞা থেকে কোনও বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করার চেষ্টা করছেন তবে এটি কিছুটা জটিল। class Globalsনিচে সমাধান যে কাছাকাছি একটি উপায়।
solstice333

4
var1 = 'var1'গ্রোভিকে ব্যবহার করে জেনকিনস পাইপলাইনে আমি পদ্ধতিটি চেষ্টা করেছি এবং এটি কার্যকর হয়নি। আমাকে ব্যবহার করতে হয়েছিল@Field var1 = 'var1'
16:55-


36
def iamnotglobal=100 // This will not be accessible inside the function

iamglobal=200 // this is global and will be even available inside the 

def func()
{
    log.info "My value is 200. Here you see " + iamglobal
    iamglobal=400
    //log.info "if you uncomment me you will get error. Since iamnotglobal cant be printed here " + iamnotglobal
}
def func2()
{
   log.info "My value was changed inside func to 400 . Here it is = " + iamglobal
}
func()
func2()

এখানে iamglobal পরিবর্তনশীল একটি বিশ্বব্যাপী দ্বারা ব্যবহৃত পরিবর্তনশীল func করুন এবং তারপর আবার উপলব্ধ func2

যদি আপনার সাথে ভেরিয়েবল ডিক্লেয়ার Def এটা, স্থানীয় করা হবে যদি আপনি Def তার বিশ্বব্যাপী ব্যবহার করবেন না


4

সমস্ত ওও ভাষার মতো, গ্রোভির নিজের দ্বারা "গ্লোবাল" কোনও ধারণা নেই (বিস্মৃত, বলুন, বেসিক, পাইথন বা পার্ল)।

যদি আপনার বেশ কয়েকটি পদ্ধতি থাকে তবে একই চলকটি ভাগ করে নেওয়া দরকার তবে একটি ক্ষেত্রটি ব্যবহার করুন:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}

2

ক্লাস বা স্ক্রিপ্ট স্কোপগুলিতে কেবল ভেরিয়েবলটি ঘোষণা করুন, তারপরে আপনার পদ্ধতি বা ক্লোজারগুলির ভিতরে থেকে এটি অ্যাক্সেস করুন। উদাহরণস্বরূপ, যদিও আপনার নির্দিষ্ট সমস্যার জন্য আরও নির্দিষ্ট হওয়া শক্ত।

তবে, গ্লোবাল ভেরিয়েবলগুলি সাধারণত খারাপ ফর্ম হিসাবে বিবেচিত হয়।

কেন একটি ফাংশন থেকে ভেরিয়েবলটি ফেরত দেবেন না, তারপরে এটি পরেরটিতে পাস করবেন?


1
আমি যদি ভেরিয়েবলটি ব্যবহার করতে চাই তবে যার মানটি বন্ধের মধ্যে দেওয়া হয়েছে? উদাহরণস্বরূপ: স্ক্রিপ্টের শুরুতে আমার ডিফ a = নাল রয়েছে। এখন একটি ক্লোজারের ভিতরে, একটি = 'কিছু স্ট্রিং'-এর মান নির্ধারিত হয়েছে। আমি চাই যে এই নতুন মানটি অন্যান্য সমস্ত বন্ধের জন্য অ্যাক্সেসযোগ্য হোক। ধন্যবাদ
999

সত্যি? আপনি
নিজেরাই

আমি এমন একটি ক্লোজার তৈরি শেষ করেছি যা কাঙ্ক্ষিত গণিত মানটি ফেরত দেয় এবং যেখানে এটি প্রয়োজন সেখানে ব্যবহার করে
OK999

1

আমি মনে করি আপনি ক্লাস স্তরের ভেরিয়েবল সম্পর্কে কথা বলছেন। গ্লোবাল ভেরিয়েবল / ক্লাস স্তরের ভেরিয়েবল ব্যবহার করে উপরে উল্লিখিত হিসাবে নেওয়া ভাল অভ্যাস নয়।

আপনি যদি সত্যিই এটি ব্যবহার করতে চান। এবং আপনি যদি নিশ্চিত হন যে কোনও প্রভাব পড়বে না ...

পদ্ধতিতে কোনও পরিবর্তনশীল ঘোষণা করুন। ভেরিয়েবল টাইপ সহ ক্লাস স্তরে

উদাহরণ:

{
   method()
   {
      a=10
      print(a)
   }

// def a or int a wont work

a=0

}

এটি একটি পরিষ্কার পদ্ধতির নাও হতে পারে, তবে এটি কাজ করে;) ধন্যবাদ।
নিকোল স্টুটজ

1
def sum = 0

// This method stores a value in a global variable.
def add =
{ 
    input1 , input2 ->
    sum = input1 + input2;
}

// This method uses stored value.
def multiplySum =   
{
    input1 ->
        return sum*input1;
}

add(1,2);
multiplySum(10);

0

আপনি কী চান তা অনুধাবন করতে পারিনি, তবে আপনার এই জাতীয় কিছু দরকার? :

def a = { b -> b = 1 }
bValue = a()
println b // prints 1

এখন bValueমানটির মধ্যে রয়েছে bযা বন্ধের ক্ষেত্রে একটি পরিবর্তনশীল a। আপনারা এখন যা কিছু করতে bValueপারেন আমি যদি আপনার প্রশ্নটি ভুল বুঝে থাকি তবে আমাকে জানান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.