স্ক্যালায় 'টাইপ' কীওয়ার্ডটি কী তা বোঝা হচ্ছে


144

আমি স্কালায় নতুন এবং আমি typeকীওয়ার্ডটি সম্পর্কে সত্যই খুব কিছু খুঁজে পাইনি । নীচের অভিব্যক্তিটির অর্থ কী তা বোঝার চেষ্টা করছি:

type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

FunctorType কোনও উপাধি হলেও এটি কী বোঝায়?

উত্তর:


148

হ্যাঁ, প্রকারের উপন্যাসটি FunctorType কেবলমাত্র একটি শর্টহ্যান্ড

(LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

টাইপ অ্যালিয়াসগুলি প্রায়শই বাকী কোডটি সহজ রাখতে ব্যবহার করা হয়: আপনি এখন লিখতে পারেন

def doSomeThing(f: FunctorType)

যা সংকলক দ্বারা ব্যাখ্যা করা হবে

def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate)

এটি অনেকগুলি কাস্টম প্রকারের সংজ্ঞা এড়াতে সহায়তা করে যা কেবলমাত্র টুপলস বা অন্য ধরণের উপর সংজ্ঞায়িত ফাংশন, উদাহরণস্বরূপ।

এছাড়া তাদের জন্য বেশ কিছু আকর্ষণীয় ব্যবহারের ক্ষেত্রে typeহিসাবে উদাহরণস্বরূপ বর্ণিত, এই অধ্যায়ের এর Scala প্রোগ্রামিং


198

প্রকৃতপক্ষে typeস্কালায় কীওয়ার্ডটি একটি সংক্ষিপ্ত নামকে জটিল টাইপ করা ছাড়াও আরও অনেক কিছু করতে পারে। এটি টাইপ সদস্যদের পরিচয় করিয়ে দেয় ।

আপনি জানেন যে, একটি শ্রেণীর মাঠের সদস্য এবং পদ্ধতি সদস্য থাকতে পারে। হ্যাঁ, স্কালা কোনও শ্রেণিকেও টাইপ সদস্য থাকতে দেয়।

আপনার বিশেষ ক্ষেত্রে typeপ্রকৃতপক্ষে এমন একটি উপাধি প্রবর্তন করা হচ্ছে যা আপনাকে আরও সংক্ষিপ্ত কোড লিখতে দেয়। টাইপ-চেকিং সম্পন্ন করার সময় টাইপ সিস্টেমটি প্রকৃত টাইপের সাথে কেবলমাত্র ওরফে প্রতিস্থাপন করে।

তবে আপনারও এরকম কিছু থাকতে পারে

trait Base {
  type T

  def method: T
}

class Implementation extends Base {
  type T = Int

  def method: T = 42
}

শ্রেণীর অন্য যে কোনও সদস্যের মতো, টাইপ সদস্যরাও বিমূর্ত হতে পারে (তাদের মানটি আসলে কী তা আপনি নির্দিষ্ট করে না) এবং প্রয়োগের ক্ষেত্রে ওভাররাইড করা যায়।

প্রকারের সদস্যদের জেনেরিকের দ্বৈত হিসাবে দেখা যায় যেহেতু জেনেরিকের সাথে আপনি যে জিনিসগুলি প্রয়োগ করতে পারেন তার বেশিরভাগ অংশ বিমূর্ত টাইপের সদস্যগুলিতে অনুবাদ করা যায়।

সুতরাং হ্যাঁ, এগুলি এলিয়াসিংয়ের জন্য ব্যবহার করা যেতে পারে তবে এগুলিকে কেবল এটির মধ্যে সীমাবদ্ধ রাখবেন না, কারণ এগুলি স্কালার টাইপ সিস্টেমের একটি শক্তিশালী বৈশিষ্ট্য।

আরও বিশদ জন্য দয়া করে এই দুর্দান্ত উত্তর দেখুন:

স্কেল: বিমূর্ত প্রকারের জেনেরিকস


44
এটি মনে রাখা জরুরী যে শ্রেণীর অভ্যন্তরে প্রকারটি ব্যবহার করে একটি উপাসের পরিবর্তে টাইপ সদস্য তৈরি করে। সুতরাং আপনার যদি কেবল একটি টাইপ ওরফে প্রয়োজন হয় তবে এটি সহযোগী অবজেক্টে সংজ্ঞায়িত করুন।
রেডিগার ক্লেন হ্যাক্ট

9

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

বিমূর্ত প্রকার:

type T

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

প্রকার বিমূর্ততা ছাড়াই

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

এখন আবার অ্যাবারস্ট্রাকশন টাইপ করুন, নিম্নলিখিত চিত্রের মাধ্যমে এবং কেবল একটি প্রকার বিমূর্ততা যুক্ত করে, আপনি ইনপুটটির ধরণটি নিজেই সাবক্লাস অনুযায়ী সংজ্ঞায়িত করতে পারেন।

অ্যাবস্ট্রাক্ট টাইপ সহ

এখন নিম্নলিখিত কোডগুলি দেখুন:

  val cow1: Cow = new Cow
  val cow2: Cow = new Cow

  cow1 eat new cow1.SuitableFood
  cow2 eat new cow1.SuitableFood

  val tiger: Tiger = new Tiger
  cow1 eat new tiger.SuitableFood // Compiler error

সংকলক খুশি এবং আমরা আমাদের নকশা উন্নত। আমরা আমাদের গরুকে গরুকে খাওয়াতে পারি S উপযুক্ত ফूड এবং সংকলক বাঘের জন্য উপযুক্ত এমন খাবারের সাথে গরুকে খাওয়ানো আমাদের আটকাবে। তবে যদি আমরা গাভী 1 SuitableFood এবং cow2 SuitabeFood এর ধরণের মধ্যে পার্থক্য করতে চাই তবে কী হবে। অন্য কথায়, কিছু দৃশ্যে এটি খুব সহজ হবে যদি আমরা যে ধরণের পথে (ধরণের অবজেক্টের মাধ্যমে) পৌঁছাতে পারি তা মূলত গুরুত্বপূর্ণ হয়ে থাকে। স্কালায় উন্নত বৈশিষ্ট্যগুলির জন্য ধন্যবাদ, এটি সম্ভব:

পাথ নির্ভরশীল প্রকারগুলি: স্কেলা অবজেক্টের সদস্য হিসাবে প্রকার থাকতে পারে। ধরণের অর্থ, আপনি এটি অ্যাক্সেস করতে যে পথটি ব্যবহার করেন তার উপর নির্ভর করে। পথটি কোনও বস্তুর রেফারেন্স দ্বারা নির্ধারিত হয় (ওরফে কোনও শ্রেণীর উদাহরণ)। এই দৃশ্য বাস্তবায়নের জন্য আপনাকে গরুর অভ্যন্তরে ঘাসের শ্রেণি নির্ধারণ করতে হবে, যেমন গরুটি বাহ্যিক শ্রেণি এবং গ্রাসটি অভ্যন্তরীণ শ্রেণি। কাঠামোটি এরকম হবে:

  class Cow extends Animal {
    class Grass extends Food
    type SuitableFood = Grass
    override def eat(food: this.SuitableFood): Unit = {}
  }

  class Tiger extends Animal {
    class Meat extends Food
    type SuitableFood = Meat
    override def eat(food: this.SuitableFood): Unit = {}
  }

এখন আপনি যদি এই কোডটি সংকলনের চেষ্টা করেন:

  1. val cow1: Cow = new Cow
  2. val cow2: Cow = new Cow

  3. cow1 eat new cow1.SuitableFood
  4. cow2 eat new cow1.SuitableFood // compilation error

৪ নং লাইনে আপনি একটি ত্রুটি দেখতে পাবেন কারণ গ্রাস এখন গরুর একটি অভ্যন্তর শ্রেণি, সুতরাং গ্রাসের উদাহরণ তৈরি করতে আমাদের একটি গাভী জিনিস প্রয়োজন এবং এই গরু বস্তুটি পথ নির্ধারণ করে। সুতরাং 2 গরু বস্তু 2 টি পৃথক পথে উত্সাহ দেয়। এই দৃশ্যে, কাউ 2 কেবল এটির জন্য তৈরি বিশেষত খাবার খেতে চায়। তাই:

cow2 eat new cow2.SuitableFood

এখন সবাই খুশি :-)


5

"টাইপ" কীভাবে উপন্যাস হিসাবে ব্যবহার করবেন তা দেখতে কেবল একটি উদাহরণ:

type Action = () => Unit

উপরের সংজ্ঞাটি অ্যাকশনকে প্রক্রিয়াগুলির ধরণের (পদ্ধতি) যে একটি খালি প্যারামিটার তালিকা এবং সেই রিটার্ন ইউনিট গ্রহণ করে তার একটি নাম হতে হবে।

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