স্কালার পথ-নির্ভর প্রকারগুলি বলতে কী বোঝায়?


125

আমি শুনেছি স্কালায় পথ-নির্ভর ধরণের রয়েছে। এটি অভ্যন্তরীণ-ক্লাসগুলির সাথে করার কিছু কিন্তু এর আসলে কী বোঝায় এবং কেন আমি যত্ন করি?


2
@ মিশেল - আমি জানি পিডিটিগুলি কী; আমি আশা করছিলাম যে এসও উত্তর দিয়ে সমৃদ্ধ হতে পারে!
অক্সবো_লাক্স

1
আমি আশা করি পিডিটি
স্ট্যাকার 20

উত্তর:


165

আমার প্রিয় উদাহরণ:

case class Board(length: Int, height: Int) {
  case class Coordinate(x: Int, y: Int) { 
    require(0 <= x && x < length && 0 <= y && y < height) 
  }
  val occupied = scala.collection.mutable.Set[Coordinate]()
}

val b1 = Board(20, 20)
val b2 = Board(30, 30)
val c1 = b1.Coordinate(15, 15)
val c2 = b2.Coordinate(25, 25)
b1.occupied += c1
b2.occupied += c2
// Next line doesn't compile
b1.occupied += c2

সুতরাং, প্রকারটি Coordinateনির্ভর করে Boardযে এটি থেকে ইনস্ট্যান্ট করা হয়েছিল। এটির সাথে সম্পন্ন হতে পারে এমন সমস্ত ধরণের জিনিস রয়েছে যা এক ধরণের ধরণের সুরক্ষা দেয় যা মানগুলির উপর নির্ভরশীল এবং একমাত্র ধরণের নয়।

এটি নির্ভরশীল ধরণের মতো শোনাতে পারে তবে এটি আরও সীমাবদ্ধ। উদাহরণস্বরূপ, প্রকারের occupiedমান নির্ভর করে Board। সর্বোপরি, শেষ লাইনটি না কাজ করে কারণ ধরণ c2হয় b2.Coordinate, যখন occupiedএর প্রকার Set[b1.Coordinate]। নোট করুন যে কেউ একই ধরণের সাথে অন্য শনাক্তকারী ব্যবহার করতে পারে b1, সুতরাং এটি সনাক্তকারী নয় b1যা প্রকারের সাথে সম্পর্কিত। উদাহরণস্বরূপ, নিম্নলিখিত কাজগুলি:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3

2
উত্তরের জন্য +1। আমি সর্বশেষ বাক্যটি বিভ্রান্তিকর অবস্থায় পেয়েছি: আপনি বলে থাকেন যে 'সুরক্ষা টাইপ করুন যা মানের উপর নির্ভরশীল এবং একা টাইপের নয়'। আমার কাছে এটি নির্ভরশীল প্রকারের মতো শোনাচ্ছে তবে পথ নির্ভর প্রকারগুলি প্রতি সেও মানগুলির উপর নির্ভর করে না। আপনি কি মনে করেন এটিও বিভ্রান্তিকর?
ম্যাথু ফারওয়েল

4
@Matthew আমি বুঝতে পারছি তুমি কি বলছ, কিন্তু পথ নির্ভরশীল ধরনের কি মান উপর নির্ভর করে, যদিও তা নমনীয়তা স্বাভাবিকভাবে নির্ভরশীল ধরনের সঙ্গে যুক্ত প্রদান করে না।
ড্যানিয়েল সি সোব্রাল

1
হুবহু, এটাই আমার অর্থ। প্রাথমিকভাবে আমি পড়লাম যে টাইপটি কনস্ট্রাক্টরকে দেওয়া মানগুলির উপর নির্ভর করে, বি 1 / বি 2 নয়। আমি এখন এটি বুঝতে পারি, তবে এটি পেতে আমাকে কয়েকটা পড়তে লাগল।
ম্যাথু ফারওয়েল

3
সবচেয়ে সহজ ব্যাখ্যা হ'ল পথ-নির্ভর ধরণগুলি ক্লোজারগুলির সাথে ক্লাস, ঠিক একইভাবে ফাংশনগুলি সুযোগ থেকে ভেরিয়েবলকে বাঁধতে পারে।
polkovnikov.ph

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