আনন্দদায়ক সহজ পদ্ধতিটি ব্যবহার করার কয়েকটি কারণ এখানে রয়েছে implicitly
।
অন্তর্নিহিত দর্শনগুলি বোঝার / সমস্যা সমাধানের জন্য
নির্বাচনের উপসর্গ (উদাহরণস্বরূপ বিবেচনা করুন, প্রযোজ্য the.prefix.selection(args)
এমন কোনও সদস্যকে ধারণ করে না এমন selection
ক্ষেত্রে args
( উদাহরণস্বরূপ বিবেচনা করুন) ইমপ্লিপ ভিউ ট্রিগার করা যেতে পারে args
this এক্ষেত্রে সংকলক অন্তর্ভুক্ত সদস্যদের সন্ধান করে, স্থানীয়ভাবে সংজ্ঞায়িত বর্তমান বা সংলগ্ন স্কোপগুলিতে, উত্তরাধিকার সূত্রে প্রাপ্ত বা আমদানি করা, সেগুলি হ'ল প্রকার থেকে নির্ধারিত, বা সমতুল্য অন্তর্নিহিত পদ্ধতিগুলির the.prefix
সাথে প্রকারভেদ selection
।
scala> 1.min(2) // Int doesn't have min defined, where did that come from?
res21: Int = 1
scala> implicitly[Int => { def min(i: Int): Any }]
res22: (Int) => AnyRef{def min(i: Int): Any} = <function1>
scala> res22(1) //
res23: AnyRef{def min(i: Int): Int} = 1
scala> .getClass
res24: java.lang.Class[_] = class scala.runtime.RichInt
অন্তর্নির্মিত দর্শনগুলিও যখন ট্রিগার করা যায় যখন কোনও অভিব্যক্তি প্রত্যাশিত ধরণের সাথে খাপ খায় না, নীচের মতো:
scala> 1: scala.runtime.RichInt
res25: scala.runtime.RichInt = 1
সংকলকটি এখানে এই ফাংশনটির সন্ধান করে:
scala> implicitly[Int => scala.runtime.RichInt]
res26: (Int) => scala.runtime.RichInt = <function1>
একটি প্রসঙ্গে বাউন্ড দ্বারা প্রবর্তিত একটি অন্তর্নিহিত প্যারামিটার অ্যাক্সেস করা
অন্তর্নিহিত প্যারামিটারগুলি ইম্পিলিটি ভিউয়ের চেয়ে স্ক্যালালের আরও গুরুত্বপূর্ণ বৈশিষ্ট্য। তারা ধরণের শ্রেণি নিদর্শনকে সমর্থন করে। মানক পাঠাগারটি scala.Ordering
এটি কয়েকটি জায়গায় ব্যবহার করে - দেখুন এবং এটি কীভাবে ব্যবহৃত হয় SeqLike#sorted
। অন্তর্নিহিত প্যারামিটারগুলি অ্যারে উদ্ভাসিত করতে এবং CanBuildFrom
উদাহরণগুলি ব্যবহার করতেও ব্যবহৃত হয় ।
স্কেলা ২.৮ সূক্ষ্ম প্যারামিটারগুলির জন্য একটি শর্টহ্যান্ড সিনট্যাক্সের অনুমতি দেয়, যা কনটেক্সট বাউন্ডস বলে। সংক্ষেপে, একটি টাইপ প্যারামিটার সহ A
এমন একটি পদ্ধতি যার জন্য প্রকারের একটি অন্তর্নিহিত পরামিতি প্রয়োজন M[A]
:
def foo[A](implicit ma: M[A])
এটি আবার লিখতে পারেন:
def foo[A: M]
তবে অন্তর্নিহিত প্যারামিটারটি পাস করার তবে এটির নামকরণ কী? পদ্ধতিটি কার্যকর করার সময় এটি কীভাবে কার্যকর হতে পারে foo
?
প্রায়শই, অন্তর্নিহিত প্যারামিটারটি সরাসরি উল্লেখ করা দরকার না, এটি অন্য পদ্ধতির অন্তর্নিহিত যুক্তি হিসাবে সুরক্ষিত হবে যা বলা হয়। যদি এটির প্রয়োজন হয়, আপনি এখনও প্রাসঙ্গিক বাউন্ডের সাথে সংশ্লেষ পদ্ধতি স্বাক্ষরটি ধরে রাখতে পারেন, এবং implicitly
মানটি বাস্তবায়নের জন্য কল করতে পারেন:
def foo[A: M] = {
val ma = implicitly[M[A]]
}
সুস্পষ্টভাবে অন্তর্নিহিত পরামিতিগুলির একটি উপসেট পাস করা
ধরুন আপনি কোনও পদ্ধতিতে কল করছেন যা কোনও ব্যক্তিকে প্রিন্ট করে, টাইপ শ্রেণীবদ্ধ পদ্ধতির ব্যবহার করে:
trait Show[T] { def show(t: T): String }
object Show {
implicit def IntShow: Show[Int] = new Show[Int] { def show(i: Int) = i.toString }
implicit def StringShow: Show[String] = new Show[String] { def show(s: String) = s }
def ShoutyStringShow: Show[String] = new Show[String] { def show(s: String) = s.toUpperCase }
}
case class Person(name: String, age: Int)
object Person {
implicit def PersonShow(implicit si: Show[Int], ss: Show[String]): Show[Person] = new Show[Person] {
def show(p: Person) = "Person(name=" + ss.show(p.name) + ", age=" + si.show(p.age) + ")"
}
}
val p = Person("bob", 25)
implicitly[Show[Person]].show(p)
আমরা যদি নামটি আউটপুট হিসাবে পরিবর্তন করতে চাই তবে কী হবে? আমরা স্পষ্টভাবে কল করতে পারি PersonShow
, স্পষ্টভাবে একটি বিকল্প পাস করতে পারি Show[String]
, তবে আমরা সংকলকটি পাস করতে চাই Show[Int]
।
Person.PersonShow(si = implicitly, ss = Show.ShoutyStringShow).show(p)