স্কালার প্রসঙ্গ এবং দেখার সীমা কী?


267

একটি সহজ উপায়ে, প্রসঙ্গ এবং দেখার সীমা কী এবং তাদের মধ্যে পার্থক্য কী?

কিছু সহজে অনুসরণ করার উদাহরণগুলিও দুর্দান্ত হবে!

উত্তর:


477

আমি ভেবেছিলাম এটি ইতিমধ্যে জিজ্ঞাসা করা হয়েছিল, তবে, যদি হয় তবে প্রশ্নটি "সম্পর্কিত" বারে আপাত নয়। সুতরাং, এটি এখানে:

ভিউ বাউন্ড কী?

একটি দৃশ্য আবদ্ধ একটি প্রক্রিয়া Scala চালু কিছু টাইপ এর ব্যবহার নিশ্চিত করার ছিল A যেন এটা কিছু টাইপ ছিল B। সাধারণ বাক্য গঠনটি হ'ল:

def f[A <% B](a: A) = a.bMethod

অন্য কথায়, উপলব্ধ Aকরার জন্য একটি অন্তর্নিহিত রূপান্তর থাকা উচিত B, যাতে Bকোনও ধরণের কোনও জিনিসে পদ্ধতি কল করতে পারে A। স্ট্যান্ডার্ড লাইব্রেরিতে (স্যান্ডাল ২.৮.০ এর আগে) সীমাবদ্ধতার সর্বাধিক সাধারণ ব্যবহার এর সাথে রয়েছে Ordered:

def f[A <% Ordered[A]](a: A, b: A) = if (a < b) a else b

এক রূপান্তর করতে পারেন কারণ Aএকটি মধ্যে Ordered[A], এবং কারণ Ordered[A]সংজ্ঞায়িত পদ্ধতি <(other: A): Boolean, আমি অভিব্যক্তি ব্যবহার করতে পারেন a < b

দয়া করে সচেতন হন যে দেখার সীমাটি অবমূল্যায়ন করা হয়েছে , আপনার এগুলি এড়ানো উচিত।

একটি প্রসঙ্গে বাউন্ড কি?

প্রসঙ্গের সীমাটি স্কেলা ২.৮.০ এ প্রবর্তিত হয়েছিল এবং সাধারণত তথাকথিত ধরণের শ্রেণিবদ্ধ ধরণের সাথে ব্যবহৃত হয় , কোডের একটি প্যাটার্ন যা হাস্কেল প্রকারের ক্লাসগুলির দ্বারা সরবরাহিত কার্যকারিতা অনুকরণ করে যদিও আরও ভার্বোস পদ্ধতিতে।

ভিউ বাউন্ডকে সাধারণ ধরণের (উদাহরণস্বরূপ A <% String) ব্যবহার করা যেতে পারে , তবে একটি প্রসঙ্গে বাউন্ডারের জন্য প্যারামিটারাইজড টাইপের প্রয়োজন হয় যেমন Ordered[A]উপরের মতো, তবে বিপরীতে String

একটি প্রসঙ্গের বাউন্ডে বাউন্ডের অন্তর্নিহিত রূপান্তর দেখার পরিবর্তে একটি অন্তর্নিহিত মানকে বর্ণনা করে । এটি ঘোষণা করতে ব্যবহৃত হয় যে কোনও ধরণের জন্য , প্রকারের অন্তর্নিহিত মান উপলব্ধ। বাক্য গঠনটি এভাবে চলে:AB[A]

def f[A : B](a: A) = g(a) // where g requires an implicit value of type B[A]

এটি দেখার সাথে আবদ্ধ হওয়ার চেয়ে আরও বিভ্রান্তিকর কারণ এটি কীভাবে ব্যবহার করবেন তা তাত্ক্ষণিকভাবে পরিষ্কার নয়। স্কালায় ব্যবহারের সাধারণ উদাহরণ হ'ল:

def f[A : ClassManifest](n: Int) = new Array[A](n)

একটি Arrayস্থিতিমাপ কর ধরনের উপর আরম্ভের একটি প্রয়োজন ClassManifestটাইপ ইরেজিওর এবং অ্যারে অ-ইরেজিওর প্রকৃতি এর সাথে সম্পর্কিত রহস্যময় কারণে, উপলব্ধ করা হয়।

গ্রন্থাগারের আরও একটি সাধারণ উদাহরণ কিছুটা জটিল:

def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)

এখানে, implicitlyআমরা চাই এমন অন্তর্নিহিত মানটি পুনরুদ্ধার করতে ব্যবহৃত হয়, যেকোন ধরণের Ordering[A], কোন শ্রেণিটি পদ্ধতিটি সংজ্ঞায়িত করে compare(a: A, b: A): Int

আমরা নীচে এটি করার আরও একটি উপায় দেখতে পাব।

ভিউ বাউন্ডস এবং প্রসঙ্গের সীমাগুলি কীভাবে প্রয়োগ করা হয়?

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

def f[A <% B](a: A) = a.bMethod
def f[A](a: A)(implicit ev: A => B) = a.bMethod

def g[A : B](a: A) = h(a)
def g[A](a: A)(implicit ev: B[A]) = h(a)

সুতরাং, স্বাভাবিকভাবেই, কেউ তাদের সম্পূর্ণ বাক্য বাক্যগুলিতে লিখতে পারেন, যা প্রসঙ্গে সীমাবদ্ধতার জন্য বিশেষভাবে কার্যকর:

def f[A](a: A, b: A)(implicit ord: Ordering[A]) = ord.compare(a, b)

ভিউ সীমাগুলি কীসের জন্য ব্যবহৃত হয়?

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

দেখার সীমাবদ্ধ ব্যবহারের ক্লাসিক উদাহরণ হ্যান্ডলিং Ordered। নোটটি এটি Intনয় Ordered, উদাহরণস্বরূপ, যদিও এখানে অন্তর্নিহিত রূপান্তর রয়েছে। পূর্বে প্রদত্ত উদাহরণটির একটি দর্শনীয় আবশ্যক কারণ এটি রূপান্তরিত নয় এমন প্রকারটি প্রদান করে:

def f[A <% Ordered[A]](a: A, b: A): A = if (a < b) a else b

এই উদাহরণটি দেখার সীমা ছাড়াই কাজ করবে না। যাইহোক, আমি যদি অন্য কোনও ধরণের ফেরত পাঠাতে চাই তবে আমার আর দেখার মত প্রয়োজন নেই:

def f[A](a: Ordered[A], b: A): Boolean = a < b

সামনে আমি প্যারামিটার পাস রূপান্তর এখানে (প্রয়োজন হলে) ঘটে f, তাই fএটা সম্পর্কে জানা প্রয়োজন নেই।

এছাড়াও Ordered, লাইব্রেরির সর্বাধিক সাধারণ ব্যবহার হ্যান্ডলিং Stringএবং Arrayযা জাভা ক্লাসগুলি যেমন স্কেল সংগ্রহ হিসাবে ছিল। উদাহরণ স্বরূপ:

def f[CC <% Traversable[_]](a: CC, b: CC): CC = if (a.size < b.size) a else b

যদি কেউ দেখার সীমা ছাড়াই এটি করার চেষ্টা করে, তবে এর রিটার্ন টাইপটি Stringহবে WrappedString(স্কেলা ২.৮) এবং একইভাবে Array

টাইপটি কেবলমাত্র রিটার্ন টাইপের টাইপ প্যারামিটার হিসাবে ব্যবহৃত হয় এমনকি একই জিনিস ঘটে:

def f[A <% Ordered[A]](xs: A*): Seq[A] = xs.toSeq.sorted

প্রবন্ধের সীমাগুলি কীসের জন্য ব্যবহৃত হয়?

প্রাসঙ্গিক সীমাটি মূলত যা হ্যাস্কেলের ধরণের শ্রেণির জন্য একটি রেফারেন্স হিসাবে টাইপক্লাস প্যাটার্ন হিসাবে পরিচিত হয়েছে তাতে ব্যবহৃত হয় । মূলত, এই প্যাটার্নটি একজাতীয় অ্যাডাপ্টার প্যাটার্নের এক ধরণের মাধ্যমে কার্যকারিতা উপলব্ধ করার মাধ্যমে উত্তরাধিকারের বিকল্প প্রয়োগ করে।

ক্লাসিক উদাহরণটি স্কেলা ২.৮ এর Ordering, যা Orderedস্কালার লাইব্রেরি জুড়ে প্রতিস্থাপিত হয়েছিল । ব্যবহারটি হ'ল:

def f[A : Ordering](a: A, b: A) = if (implicitly[Ordering[A]].lt(a, b)) a else b

যদিও আপনি সাধারণত এটি লিখিত দেখতে পাবেন:

def f[A](a: A, b: A)(implicit ord: Ordering[A]) = {
    import ord.mkOrderingOps
    if (a < b) a else b
}

যা অভ্যন্তরীণ কিছু অন্তর্নিহিত রূপান্তরগুলির সুবিধা গ্রহণ করে Orderingযা traditionalতিহ্যবাহী অপারেটর শৈলী সক্ষম করে। স্কেলা ২.৮-এর আরেকটি উদাহরণ হ'ল Numeric:

def f[A : Numeric](a: A, b: A) = implicitly[Numeric[A]].plus(a, b)

আরও জটিল উদাহরণ হ'ল নতুন সংগ্রহের ব্যবহার CanBuildFrom, তবে ইতিমধ্যে এটি সম্পর্কে একটি দীর্ঘ উত্তর রয়েছে, তাই আমি এটিকে এড়াতে চাই। এবং যেমনটি পূর্বে উল্লেখ করা হয়েছে, ClassManifestব্যবহার রয়েছে, যা কংক্রিটের ধরণের ছাড়াই নতুন অ্যারে শুরু করার প্রয়োজন।

টাইপক্লাস প্যাটার্নের সাথে আবদ্ধ প্রসঙ্গটি আপনার নিজের শ্রেণীর দ্বারা ব্যবহৃত হওয়ার সম্ভাবনা অনেক বেশি, কারণ তারা উদ্বেগের পৃথকীকরণকে সক্ষম করে, অন্যদিকে ডিজাইনের কাছাকাছি যাওয়ার জন্য এটি বেশিরভাগ ক্ষেত্রেই ব্যবহৃত হয় )।

যদিও এটি দীর্ঘ সময়ের জন্য সম্ভব হয়েছে, তবে প্রসঙ্গে প্রান্তের ব্যবহারটি ২০১০ সালে সত্যিই বন্ধ হয়ে গেছে এবং স্কালার বেশিরভাগ গুরুত্বপূর্ণ লাইব্রেরি এবং ফ্রেমওয়ার্কগুলিতে এখন কিছুটা ডিগ্রি পাওয়া গেছে। যদিও এর ব্যবহারের সর্বাধিক চূড়ান্ত উদাহরণটি হল স্কালাজ লাইব্রেরি, যা স্কালায় হাস্কেলের প্রচুর শক্তি নিয়ে আসে। এটি যেভাবে ব্যবহার করা যেতে পারে সেগুলির সাথে আরও পরিচিত হওয়ার জন্য আমি টাইপক্লাসের ধরণগুলি পড়ার পরামর্শ দিই।

সম্পাদনা

আগ্রহের সম্পর্কিত প্রশ্ন:


9
আপনাকে অনেক ধন্যবাদ. আমি জানি এর আগেও এর জবাব দেওয়া হয়েছিল, এবং সম্ভবত আমি তখন যথেষ্ট মনোযোগ দিয়ে পড়িনি, তবে এখানে আপনার ব্যাখ্যাটি আমি দেখেছি সবচেয়ে স্পষ্ট। সুতরাং, আবার আপনাকে ধন্যবাদ।
chrsan

3
@ ক্রসান আমি আরও দুটি বিভাগ যুক্ত করেছি, যেখানে একটিতে প্রতিটি ব্যবহার করা হয়েছে সে সম্পর্কে আরও বিশদ।
ড্যানিয়েল সি সোব্রাল

2
আমি মনে করি এটি একটি দুর্দান্ত ব্যাখ্যা। আমি এটি আমার জার্মান ব্লগ (dgronau.wordpress.com) এর জন্য অনুবাদ করতে চাই যদি এটি আপনার সাথে ঠিক আছে।
ল্যান্ডেই

3
এটি এখন পর্যন্ত আমি খুঁজে পাওয়া এই বিষয়টির সর্বোত্তম এবং সর্বাধিক ব্যাপক ব্যাখ্যা। প্রকৃত পক্ষে তোমাকে অনেক ধন্যবাদ!
fotNelton

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