উত্তর:
আমি ভেবেছিলাম এটি ইতিমধ্যে জিজ্ঞাসা করা হয়েছিল, তবে, যদি হয় তবে প্রশ্নটি "সম্পর্কিত" বারে আপাত নয়। সুতরাং, এটি এখানে:
একটি দৃশ্য আবদ্ধ একটি প্রক্রিয়া 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
।
একটি প্রসঙ্গের বাউন্ডে বাউন্ডের অন্তর্নিহিত রূপান্তর দেখার পরিবর্তে একটি অন্তর্নিহিত মানকে বর্ণনা করে । এটি ঘোষণা করতে ব্যবহৃত হয় যে কোনও ধরণের জন্য , প্রকারের অন্তর্নিহিত মান উপলব্ধ। বাক্য গঠনটি এভাবে চলে:A
B[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
ব্যবহার রয়েছে, যা কংক্রিটের ধরণের ছাড়াই নতুন অ্যারে শুরু করার প্রয়োজন।
টাইপক্লাস প্যাটার্নের সাথে আবদ্ধ প্রসঙ্গটি আপনার নিজের শ্রেণীর দ্বারা ব্যবহৃত হওয়ার সম্ভাবনা অনেক বেশি, কারণ তারা উদ্বেগের পৃথকীকরণকে সক্ষম করে, অন্যদিকে ডিজাইনের কাছাকাছি যাওয়ার জন্য এটি বেশিরভাগ ক্ষেত্রেই ব্যবহৃত হয় )।
যদিও এটি দীর্ঘ সময়ের জন্য সম্ভব হয়েছে, তবে প্রসঙ্গে প্রান্তের ব্যবহারটি ২০১০ সালে সত্যিই বন্ধ হয়ে গেছে এবং স্কালার বেশিরভাগ গুরুত্বপূর্ণ লাইব্রেরি এবং ফ্রেমওয়ার্কগুলিতে এখন কিছুটা ডিগ্রি পাওয়া গেছে। যদিও এর ব্যবহারের সর্বাধিক চূড়ান্ত উদাহরণটি হল স্কালাজ লাইব্রেরি, যা স্কালায় হাস্কেলের প্রচুর শক্তি নিয়ে আসে। এটি যেভাবে ব্যবহার করা যেতে পারে সেগুলির সাথে আরও পরিচিত হওয়ার জন্য আমি টাইপক্লাসের ধরণগুলি পড়ার পরামর্শ দিই।
সম্পাদনা
আগ্রহের সম্পর্কিত প্রশ্ন: