আপনি কি গ্রোভির "প্রতিটি" বন্ধ থেকে বিরতি পেতে পারেন?


143

breakগ্রোভির কাছ থেকে আসা কি সম্ভব .each{Closure}, বা এর পরিবর্তে আমার কি ক্লাসিক লুপ ব্যবহার করা উচিত?

উত্তর:


194

নাহ, আপনি ব্যতিক্রম ছোঁড়া ছাড়াই একটি "প্রতিটি" বাতিল করতে পারবেন না। আপনি যদি কোনও বিশেষ অবস্থার অধীনে বিরতি বাতিল করতে চান তবে আপনি সম্ভবত একটি ক্লাসিক লুপ চান।

বিকল্পভাবে, আপনি প্রতিটির পরিবর্তে একটি "সন্ধান" বন্ধ করতে পারেন এবং যখন আপনি কিছুটা বিরতি করতেন তখন সত্য ফিরে আসতে পারেন।

পুরো উদাহরণটি প্রক্রিয়া করার আগে এই উদাহরণটি বাতিল করা হবে:

def a = [1, 2, 3, 4, 5, 6, 7]

a.find { 
    if (it > 5) return true // break
    println it  // do the stuff that you wanted to before break
    return false // keep looping
}

ছাপে

1
2
3
4
5

তবে 6 বা 7 মুদ্রণ করে না।

এটি আপনার নিজের পুনরাবৃত্ত পদ্ধতিগুলি কাস্টম ব্রেকের আচরণের সাথে লিখতেও সহজ যা ক্লোজারগুলি গ্রহণ করে:

List.metaClass.eachUntilGreaterThanFive = { closure ->
    for ( value in delegate ) {
        if ( value  > 5 ) break
        closure(value)
    }
}

def a = [1, 2, 3, 4, 5, 6, 7]

a.eachUntilGreaterThanFive {
    println it
}

এছাড়াও মুদ্রণ:

1
2
3
4
5    

3
আমি গ্রোভির কাছে একটি প্যাচও জমা দিয়েছি যা একটি ফাইন্ড রেজাল্ট পদ্ধতি যুক্ত করে যা একটি সংক্ষিপ্তসার্চযুক্ত অনুসন্ধান করে যা বন্ধ হওয়ার পরে প্রথম অ-নালীর ফলাফল দেয়। এই পদ্ধতিটি প্রায় সমস্ত পরিস্থিতি coverাকতে ব্যবহার করা যেতে পারে যে প্রত্যেকে খুব শীঘ্রই কোনওটি ভেঙে ফেলতে চাইতে পারে। প্যাচটি এটি গ্রোভিতে
টেড নালিড

2
আমি এই কেসটি চেষ্টা করেছি: ডিফ এ = [1, 2, 3, 4, 5, 6, 7, -1, -2] এটি 1 2 3 4 5 -1 -2 এ ফিরে এসেছে। সুতরাং, "breaK" কাজ করে না।
ফট এইচ ভি ভি

সঠিক অনুসন্ধানটি সঠিক বিকল্প, প্রত্যেকে কখনই ফিরবে না
পুষ্কর

হয় findবেশী ভালো any- নিচের অন্যান্য উত্তর দেখার @Michal থেকে আমার জন্য এক কাজ
Rhubarb

টেড নালিডের প্যাঁচটি গ্রোভির জন্য খুব দরকারী। পরিবর্তে যদি ফাইন্ড অপারেশন থেকে ফলাফলটির প্রয়োজন হয় এবং এটি উপাদানটি নয় তবে এর পরিবর্তে FindResult ব্যবহার করুন। উদাহরণস্বরূপ: ​def test = [2] test.findResult{ it * 2 }​2-র পরিবর্তে 4 ফিরবে
ডগ

57

যে কোনও বন্ধের সাথে প্রতিটি লুপ প্রতিস্থাপন করুন ।

def list = [1, 2, 3, 4, 5]
list.any { element ->
    if (element == 2)
        return // continue

    println element

    if (element == 3)
        return true // break
}

আউটপুট

1
3

শুধু একটি কৌশল। "বিরতি" পরে কোনও বিবৃতি থাকলে কী হয়। "বিরতি" পূরণের পরে এই বিবৃতিটি এখনও উদ্ধৃত হবে।
ফ্যাট এইচ ভি ভি

2
@ ফ্যাট এইচ ভি ভি আমি যুক্ত করেছি "বিরতি" পরে বিবৃতি কার্যকর করা হবে না
মাইকেল জেড মুডা

1
আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. তুমি ঠিক বলছো. আমি আপনার উত্তরটিও ভোট দিয়েছি। আরও: যে কোনও পদ্ধতি DefaultGroovyMethods এ সংজ্ঞায়িত করা হয় এবং এটি একটি প্রাকটিক ফাংশন যা কোনও সংগ্রহের কোনও উপাদান সরবরাহিত প্রকেট বন্ধকে সন্তুষ্ট করলে সত্য ফিরে আসে।
ফ্যাট এইচ ভি ভি

any()এইভাবে ব্যবহার করা কিছুটা বিভ্রান্তিকর, তবে এটি অবশ্যই কাজ করে এবং আপনাকে বিরতি বা চালিয়ে যাওয়ার ক্ষমতা দেয় ।
vegemite4me

1
@ Vegemite4me এর মত, আমার মনে হয় এটি একটি "কৌশল" তবে আপনি কোনওটির অর্থ ভালভাবে বুঝতে পারেন না। মেইনটেবিলিটির জন্য, আপনার এই সমাধানটি ব্যবহার করা উচিত নয়।
MatRt

11

না, আপনি ব্যতিক্রম ছুঁড়ে না দিয়ে গ্রোভির কোনও বন্ধ থেকে ভাঙতে পারবেন না। এছাড়াও, নিয়ন্ত্রণ প্রবাহের জন্য আপনার ব্যতিক্রম ব্যবহার করা উচিত নয়।

আপনি যদি নিজেকে কোনও বন্ধ হয়ে যেতে চান বলে মনে করেন তবে প্রথমে আপনি কেন এটি করতে চান এবং এটি কীভাবে করবেন না তা নিয়ে আপনার প্রথমে চিন্তা করা উচিত। গ্রোভির (ধারণাগত) উচ্চতর অর্ডার ফাংশনগুলির মধ্যে একটিতে প্রশ্নে প্রথমে বিবেচনা করা বন্ধের বিকল্প হতে পারে consider নিম্নলিখিত উদাহরণ:

for ( i in 1..10) { if (i < 5) println i; else return}

হয়ে

(1..10).each{if (it < 5) println it}

হয়ে

(1..10).findAll{it < 5}.each{println it} 

যা স্বচ্ছতাতেও সহায়তা করে। এটি আপনার কোডের অভিপ্রায়টিকে আরও ভালভাবে জানিয়েছে।

প্রদর্শিত উদাহরণগুলির মধ্যে সম্ভাব্য ত্রুটি হ'ল পুনরাবৃত্তি কেবল প্রথম উদাহরণের প্রথমদিকে থামে। আপনার যদি পারফরম্যান্স বিবেচনা করে থাকেন তবে আপনি এটিকে তত্ক্ষণাত বন্ধ করতে চাইতে পারেন।

তবে, বেশিরভাগ ব্যবহারের ক্ষেত্রে যা পুনরাবৃত্তির সাথে জড়িত থাকে আপনি সাধারণত গ্রোভির সন্ধান, গ্রেপ, সংগ্রহ, ইনজেকশন ইত্যাদি পদ্ধতিতে অবলম্বন করতে পারেন। তারা সাধারণত কিছু "কনফিগারেশন" নেয় এবং তারপরে আপনার জন্য পুনরাবৃত্তি কীভাবে করবেন তা "জানুন", যাতে আপনি সম্ভবত যেখানেই সম্ভব অপরিহার্য লুপিং এড়াতে পারেন।


1
"না, আপনি ব্যতিক্রম না ছুঁড়ে গ্রোভির
ওলিপি

2

সবে বিশেষ ক্লোজার ব্যবহার করছি

// declare and implement:
def eachWithBreak = { list, Closure c ->
  boolean bBreak = false
  list.each() { it ->
     if (bBreak) return
     bBreak = c(it)
  }
}

def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
  if (it > 3) return true // break 'eachWithBreak'
  println it
  return false // next it
}

3
এবং যদি আপনার 1 বিলিয়ন সারি থাকে এবং প্রথম কলটিতে অভ্যন্তরীণ বন্ধটি সত্য হয়ে যায়, তবে আপনি 1 বিলিয়ন বিয়োগফলের একটি মানকে পুনরাবৃত্তি করতে পারবেন। :(
এসবিগ্লাসিয়াস

-4

(1..10) .each {

যদি (এটি <5)

এটি মুদ্রণ

আর

মিথ্যা প্রত্যাবর্তন


2
এটি এর মধ্যে বিচ্ছিন্ন হয় না each, এটি কেবল 4-এর চেয়ে বড় মানগুলি মুদ্রণ করে না The elseএটি অতিমাত্রায় হয়, আপনার কোডটি এটি ছাড়াই একই কাজ করে। এছাড়াও, আপনি প্রমাণ করতে পারেন যে আপনি ঠিক পরে এবং ঠিক আগে রাখলে eachতা ভেঙে যায় না । return falseprintln "not breaking"elsereturn false
স্টিফান ভ্যান ড্যান আকার

পাঠযোগ্যতার জন্য আপনার কোডটি ফর্ম্যাট করার জন্য দয়া করে কমপক্ষে সর্বনিম্ন প্রচেষ্টা করুন। আপনি যখন উত্তর দেবেন এবং কীভাবে এটি করবেন তার নির্দেশনার অনেকগুলি পূর্বরূপ রয়েছে
ম্যাটিউজ

-11

আপনি দ্বারা বিরতি করতে পারে RETURN। উদাহরণ স্বরূপ

  def a = [1, 2, 3, 4, 5, 6, 7]
  def ret = 0
  a.each {def n ->
    if (n > 5) {
      ret = n
      return ret
    }
  }

এটা আমার জন্য কাজ করে!


6
ওপি যা জিজ্ঞাসা করেছিল ঠিক সেটাই, যদিও তা স্পষ্টতই তার অর্থ কি তা নয়।
সজোকস্কে

এর নেতিবাচক ভোট কেন আমার একটি বিবরণ থাকতে পারে? এটি আমার কাছে শীর্ষ ধারণাটি +133 ভোটের সাথে (কম ব্যাখ্যা দিয়ে) যা বলেছে ঠিক একই ধারণা বলে মনে হচ্ছে।
স্কেপি

1
@ স্কেপি আপনি বন্ধের উপরের "ব্রেক" করতে পারবেন না। আপনি anyফিরে এসে অ্যারের পদ্ধতিটি ভাঙ্গতে পারেন false। আপনি eachএকই পদ্ধতিতে ভাঙ্গতে পারবেন না ।
Nux
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.