স্কালায় প্যাটার্ন মিলটি কীভাবে বাইটোকড স্তরে প্রয়োগ করা হয়?


123

স্কালায় প্যাটার্ন মিলটি কীভাবে বাইটোকড স্তরে প্রয়োগ করা হয়?

এটি কি ধারাবাহিক if (x instanceof Foo)নির্মাণের মতো, বা অন্য কিছু? এর কর্মক্ষমতা জড়িত কি?

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেওয়া হয়েছে ( স্কালার দ্বারা উদাহরণ পৃষ্ঠাগুলি থেকে 46-48), evalপদ্ধতির সমতুল্য জাভা কোডটি কেমন হবে?

abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr

def eval(e: Expr): Int = e match {
  case Number(x) => x
  case Sum(l, r) => eval(l) + eval(r)
}

পিএস আমি জাভা বাইটকোডটি পড়তে পারি, সুতরাং বাইটকোডের উপস্থাপনাটি আমার পক্ষে যথেষ্ট ভাল তবে অন্য পাঠকদের পক্ষে জাভা কোডটির মতো দেখতে কেমন হবে তা জানা ভাল better

পিপিএস স্ক্যালায় ইন প্রোগ্রামিং বইটি কীভাবে স্কালা বাস্তবায়িত হয় সে সম্পর্কে এবং এই জাতীয় প্রশ্নের উত্তর দেয়? আমি বইটি অর্ডার করেছি, তবে এটি এখনও আসেনি।


আপনি কেন কেবল উদাহরণটি সংকলন করে এবং এটি একটি জাভা বাইটকোড বিচ্ছিন্নকরণের সাথে বিচ্ছিন্ন করে দিচ্ছেন না?
জিফ্রে

আমি সম্ভবত এটি করব, যদি না কেউ প্রথমে ভাল উত্তর দেয়। তবে এখনই কিছুটা ঘুম পেতে চাই। ;)
এসকো লুন্তটোলা

27
প্রশ্নটি অন্য পাঠকদের পক্ষে কার্যকর!
djondal

1
@ জঞ্জাল: এটি বলার সর্বোত্তম উপায়টি কেবলমাত্র প্রশ্নটি
উজ্জীবিত করা

উত্তর:


96

নিম্ন স্তরটি একটি বিচ্ছিন্নকরণের সাথে অন্বেষণ করা যেতে পারে তবে সংক্ষিপ্ত উত্তরটি হ'ল এটি যদি / এলেসের একগুচ্ছ যেখানে ভবিষ্যদ্বাণীটি প্যাটার্নের উপর নির্ভর করে

case Sum(l,r) // instance of check followed by fetching the two arguments and assigning to two variables l and r but see below about custom extractors 
case "hello" // equality check
case _ : Foo // instance of check
case x => // assignment to a fresh variable
case _ => // do nothing, this is the tail else on the if/else

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

এগুলি ছাড়াও, আপনি স্কেল কেস ক্লাসের জন্য ব্যবহার করে এমন ডিফল্ট যেকোন পরিবর্তে বা তার পরিবর্তে আপনার নিজস্ব কাস্টম এক্সট্র্যাক্টরগুলি লিখতে পারেন। যদি আপনি এটি করেন, তবে প্যাটার্ন মিলের ব্যয় হ'ল এক্সট্রাক্টর যা কিছু করে তার দাম। একটি ভাল ওভারভিউ http://lamp.epfl.ch/~emir/written/ ম্যাচিংঅবজেক্টস উইথপ্যাটার্নস- TR.pdf এ পাওয়া যায়


আমি বিশ্বাস করি এটি বর্তমান লিঙ্ক: infos
ज्ञान.

78

জেমস (উপরে) এটি সেরা বলেছেন। তবে আপনি যদি কৌতূহলী হন তবে বিচ্ছিন্ন বাইটকোডটি দেখার জন্য এটি সর্বদা একটি ভাল অনুশীলন। এছাড়াও আপনি ডাকা যাবে scalacসঙ্গে -printবিকল্প, যা আপনার প্রোগ্রাম প্রিন্ট হবে সব Scala-নির্দিষ্ট মুছে বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে। এটি মূলত স্কালার পোশাকের জাভা। scalac -printআপনার দেওয়া কোড স্নিপেটের জন্য এখানে প্রাসঙ্গিক ফলাফল রয়েছে:

def eval(e: Expr): Int = {
  <synthetic> val temp10: Expr = e;
  if (temp10.$isInstanceOf[Number]())
    temp10.$asInstanceOf[Number]().n()
  else
    if (temp10.$isInstanceOf[Sum]())
      {
        <synthetic> val temp13: Sum = temp10.$asInstanceOf[Sum]();
        Main.this.eval(temp13.e1()).+(Main.this.eval(temp13.e2()))
      }
    else
      throw new MatchError(temp10)
};

34

সংস্করণ ২.৮ থেকে স্কালায় @ সুইচ টীকা রয়েছে। লক্ষ্যটি নিশ্চিত করা, সেই প্যাটার্ন মিলটি শর্তাধীন ifবিবৃতিগুলির সিরিজের পরিবর্তে টেবিলসুইচ বা লাক্সুয়াউসউইচতে সংকলিত হবে ।


6
কখন নিয়মিত @ সুইচ বেছে নেবেন?
অরবিন্দ ইয়াররাম

2
@switchনিয়মিত প্যাটার্ন মিলের চেয়ে ব্যবহার আরও কার্যকর। তাই যদি সব ক্ষেত্রে ধ্রুবক মান থাকতে, আপনি সবসময় ব্যবহার করা উচিত @switch(কারণ বাইটকোড বাস্তবায়ন জাভার একই হবে যেমন switchঅনেক যদি-অন্য পরিবর্তে)
লেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.