স্কালায় কেন ফিরে আসে তবে বিরতি না দিয়ে চালিয়ে যায়


22

স্কালার নেই breakবা continueতাই কিছু লুপ আচরণ কিছুটা চিন্তাভাবনা করে।

একটি লুপ তাড়াতাড়ি শেষ করতে লেজ পুনরুক্তি, ব্যতিক্রম বা scala.util.control.Breaks(যা ব্যতিক্রম ব্যবহার করে) প্রয়োজন।

এর যুক্তিটি হ'ল, যেমন goto, এগুলি প্রবাহকেই অস্পষ্ট করে তোলে এবং এগুলি আরও ভাল, কম আশ্চর্যজনক উপায়ে সম্পন্ন করা যায়।

তবে মনে হয় সেই একই যুক্তিগুলি ব্যবহার করা যেতে পারে return

কেন স্কালা ইচ্ছাকৃতভাবে বাদ পড়ল breakএবং continue, তবে নয় return?


1
আমি কল্পনা করতে পারি যে ভাষা লেখক হিসাবে লেজ পুনরাবৃত্তির বিবেচনা পথ পুনরাবৃত্তির গঠন করা। আমি এটি কল্পনা করতে পারি এবং অতিরিক্ত কিছু ক্লিনআপ যন্ত্রপাতি দরকার। OTOH একটি ক্রিয়াকলাপটিকে সুশৃঙ্খলভাবে শেষ করার উপায় এবং যে কোনও ক্লিনআপ যন্ত্রপাতি ইতিমধ্যে সেখানে রয়েছে। breakcontinuereturn
9:

1
নেই breakable { for { break; } }কিন্তু একটি অনুচিন্তা, এবং সম্ভবত এ পর্যন্ত দক্ষ থেকে।
জোপ এগজেন

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

2
এই প্রশ্নের মনে হচ্ছে এর এখানে একটি উত্তর রয়েছে: স্ট্যাকওভারফ্লো.com
Michael

3
@PaulDraper: জন্য উত্তর breakএবং continueআপনার প্রশ্নের এবং আপনার প্রশ্নে লিঙ্কে অন্তর্ভুক্ত করা হয়। জন্য প্রশ্ন return-ভোট উপরে, গৃহীত উত্তর ঠিক কি প্রশ্ন আমি লিঙ্ক সম্পর্কে ছিল, এবং অন্তত উত্তর দেওয়া হয়েছিল। যদি দুটি উত্তর একসাথে করা হয় তবে আপনার প্রশ্নের উত্তর না দিলে, আপনি প্রশ্নটি এটি পরিষ্কার করতে সম্পাদনা করতে পারেন।
মাইকেল শ

উত্তর:


16

বিরতি এবং চালিয়ে যান:

ইন Scala সম্পর্কে একটি আলাপ , মার্টিন Odersky 3 কারণে বিরতি অন্তর্ভুক্ত অথবা স্লাইড 22 ধরে চলতে থাকার জন্য দিলেন না

  • এগুলি কিছুটা অপরিহার্য; ভাল অনেক ছোট ফাংশন ব্যবহার।
  • ক্লোজারগুলির সাথে কীভাবে ইন্টারঅ্যাক্ট করবেন তা ইস্যু
  • তাদের দরকার নেই!

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

লাইব্রেরিতে এ জাতীয় স্টাফ প্রয়োগ করতে সক্ষম হওয়া মূল ভাষাটিকে সহজতর করে।

মার্টিন ওডারস্কি, লেক্স চামচ এবং বিল ভেনারদের দ্বারা 'প্রোগ্রামিং ইন স্কালায়, দ্বিতীয় সংস্করণে', নিম্নলিখিত ব্যাখ্যা দেওয়া হয়েছে:

আপনি খেয়াল করে থাকতে পারেন যে breakবা এর কোন উল্লেখ নেই continue। স্কালা এই আদেশগুলি বাদ দেয় কারণ এগুলি ফাংশন লিটারালগুলির সাথে ভালভাবে জাল হয় না ... এটি লুপের continueঅভ্যন্তরের অর্থ কী তা স্পষ্ট while, তবে ফাংশন আক্ষরিক অভ্যন্তরে এর অর্থ কী? ... আছে ছাড়া প্রোগ্রাম অনেক উপায় আছে breakএবং continue, এবং আপনি ফাংশন লিটারেল সদ্ব্যবহার থাকলে, সেই বিকল্পের প্রায়ই মূল কোড চেয়ে খাটো হতে পারে।

ফেরত দিন:

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

একই বইয়ে তারা নিম্নলিখিত সম্পর্কে বলেছেন return:

কোনও স্পষ্ট returnবক্তব্য না থাকায় একটি স্কালা পদ্ধতি পদ্ধতি দ্বারা গুণিত শেষ মানটি প্রদান করে। পদ্ধতির জন্য প্রস্তাবিত স্টাইলটি হ'ল স্পষ্টত এবং বিশেষত একাধিক returnবিবৃতি দেওয়া এড়ানো । পরিবর্তে, প্রতিটি পদ্ধতিকে ভাব হিসাবে ভাবুন যা একটি মান দেয় যা প্রত্যাবর্তন হয়।

পদ্ধতিগুলি একটি returnবিবৃতি ব্যবহার না করা সত্ত্বেও, একটি মানটি শেষ করে এবং প্রত্যাবর্তন করে , সুতরাং ক্লোজারগুলি নিয়ে কোনও সমস্যা হতে পারে না, কারণ অন্যথায় বন্ধ হওয়ার সময়সীমা কাজ করে না।

ফাংশনটির আক্ষরিক সাথে ভালভাবে মিশতে সমস্যা হতে পারে না, যেহেতু ফাংশনটিকে যে কোনও উপায়েই ফিরে আসতে হবে।


2
প্রত্যাবর্তনের বিষয়ে, কিছুটা হালকা বিপদ বলে মনে হচ্ছে: tpolecat.github.io/2014/05/09/return.html
বার্বার

0

আমি মনে করি পূর্ববর্তী উত্তরগুলি তুলনামূলকভাবে নিয়ন্ত্রণহীন প্রেক্ষাপটে স্ক্যালার জন্য breakবা continueভাষা-বিস্তৃত পদ্ধতিতে শব্দার্থবিজ্ঞানের সংজ্ঞা দেওয়ার সমস্যার প্রতি ন্যায়বিচার করে ।

আমি একটি ছোট লাইব্রেরি লিখেছি যা সংজ্ঞায়িত করে breakএবং continueআরও সীমাবদ্ধ প্রসঙ্গে: স্কেলার মাধ্যমে অনুক্রমের উপর পুনরাবৃত্তি। সেই প্রসঙ্গে মনোনিবেশ করে আমি বিশ্বাস করি যে শব্দার্থবিজ্ঞানগুলি দ্ব্যর্থহীন এবং সহজেই যুক্তিযুক্ত হতে পারে।

পাঠাগারটি এখানে উপলভ্য: https://github.com/erikerlandson/breakable

কোডে এটি দেখতে কেমন লাগে তার একটি সাধারণ উদাহরণ:

scala> import com.manyangled.breakable._
import com.manyangled.breakable._

scala> val bkb2 = for {
     |   (x, xLab) <- Stream.from(0).breakable   // create breakable sequence with a method
     |   (y, yLab) <- breakable(Stream.from(0))  // create with a function
     |   if (x % 2 == 1) continue(xLab)          // continue to next in outer "x" loop
     |   if (y % 2 == 0) continue(yLab)          // continue to next in inner "y" loop
     |   if (x > 10) break(xLab)                 // break the outer "x" loop
     |   if (y > x) break(yLab)                  // break the inner "y" loop
     | } yield (x, y)
bkb2: com.manyangled.breakable.Breakable[(Int, Int)] = com.manyangled.breakable.Breakable@34dc53d2

scala> bkb2.toVector
res0: Vector[(Int, Int)] = Vector((2,1), (4,1), (4,3), (6,1), (6,3), (6,5), (8,1), (8,3), (8,5), (8,7), (10,1), (10,3), (10,5), (10,7), (10,9))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.