স্কেলা ২.৮ এর নতুন বৈশিষ্ট্যগুলির একটি হ'ল প্রসঙ্গের সীমা। কোন প্রসঙ্গ আবদ্ধ এবং এটি কোথায় কার্যকর?
অবশ্যই আমি প্রথম অনুসন্ধান (এবং উদাহরণস্বরূপ পাওয়া এই ) কিন্তু আমি কোনো সত্যিই স্পষ্ট এবং বিস্তারিত তথ্য খুঁজে পাইনি।
স্কেলা ২.৮ এর নতুন বৈশিষ্ট্যগুলির একটি হ'ল প্রসঙ্গের সীমা। কোন প্রসঙ্গ আবদ্ধ এবং এটি কোথায় কার্যকর?
অবশ্যই আমি প্রথম অনুসন্ধান (এবং উদাহরণস্বরূপ পাওয়া এই ) কিন্তু আমি কোনো সত্যিই স্পষ্ট এবং বিস্তারিত তথ্য খুঁজে পাইনি।
উত্তর:
আপনি এই নিবন্ধটি খুঁজে পেয়েছেন ? এটি অ্যারে উন্নতির প্রসঙ্গে, নতুন প্রসঙ্গে আবদ্ধ বৈশিষ্ট্যটি কভার করে।
সাধারণত, প্রসঙ্গে আবদ্ধ একটি ধরণের পরামিতি ফর্মের হয় [T: Bound]
; এটি প্রসারিত ধরণের প্যারামিটারের সাথে T
একসাথে প্লেইন টাইপ প্যারামিটারে প্রসারিত হয় Bound[T]
।
পদ্ধতিটি বিবেচনা করুন tabulate
যা একটি প্রদত্ত ফাংশন এফ প্রয়োগের ফলাফল থেকে 0 থেকে একটি নির্দিষ্ট দৈর্ঘ্য পর্যন্ত একটি পরিসীমাটিতে অ্যারে গঠন করে Consider স্কেল ২.7 অবধি, ট্যাবুলেটটি নিম্নরূপ লেখা যেতে পারে:
def tabulate[T](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
স্কেলা ২.৮ এ এটি আর সম্ভব নয়, কারণ সঠিক সময় উপস্থাপনের জন্য রানটাইম তথ্য প্রয়োজনীয় Array[T]
। ClassManifest[T]
অন্তর্নিহিত পরামিতি হিসাবে পদ্ধতিতে পাস করে একজনকে এই তথ্য সরবরাহ করতে হবে :
def tabulate[T](len: Int, f: Int => T)(implicit m: ClassManifest[T]) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
একটি শর্টহ্যান্ড ফর্ম হিসাবে, প্রসঙ্গের সীমাটি T
পরিবর্তিত প্যারামিটারের পরিবর্তে ব্যবহার করা যেতে পারে :
def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
রবার্টের উত্তর কনটেক্সট বাউন্ডের প্রযুক্তিগত বিবরণকে কভার করে। আমি তাদের অর্থ সম্পর্কে আমার ব্যাখ্যা দেব।
স্কালায় একটি ভিউ বাউন্ড ( A <% B
) 'হিসাবে দেখা যেতে পারে' এর ধারণাকে ক্যাপচার করে (যেখানে একটি ওপরের সীমানা <:
'' এ '' এর ধারণাকে ধারণ করে)। একটি প্রসঙ্গ আবদ্ধ ( A : C
) বলে একটি প্রকার সম্পর্কে 'একটি' আছে। আপনি " T
একটি আছে Manifest
" হিসাবে উদ্ভাসের উদাহরণগুলি পড়তে পারেন । আপনি প্রায় Ordered
বনামের সাথে সংযুক্ত উদাহরণটি Ordering
পার্থক্যের চিত্রণ করে rates একটি পদ্ধতি
def example[T <% Ordered[T]](param: T)
যে পরামিতি একটি হিসাবে দেখা যেতে পারে বলে Ordered
। তুলনা করা
def example[T : Ordering](param: T)
যা বলে যে প্যারামিটারটির একটি যুক্ত রয়েছে Ordering
।
ব্যবহারের ক্ষেত্রে, সম্মেলনগুলি প্রতিষ্ঠিত হতে কিছুটা সময় নিয়েছিল, তবে দেখার সীমাগুলির তুলনায় প্রসঙ্গের সীমাগুলি অগ্রাধিকার দেওয়া হয় ( দেখার সীমাটি এখন হ্রাস করা হয়েছে )। একটি পরামর্শ হ'ল একটি প্রসঙ্গের সীমাটি অগ্রাধিকার দেওয়া হয় যখন আপনাকে সরাসরি কোনও রেফারেন্সের প্রয়োজন ছাড়াই একটি স্কোপ থেকে অন্য স্কোলে একটি অন্তর্নিহিত সংজ্ঞা স্থানান্তর করতে হয় (এটি অবশ্যই ClassManifest
অ্যারে তৈরির জন্য ব্যবহৃত ক্ষেত্রে হয় )।
দেখার সীমা এবং প্রসঙ্গের সীমা সম্পর্কে চিন্তা করার আর একটি উপায় হ'ল প্রথমটি কলারের সুযোগ থেকে নিখুঁত রূপান্তর স্থানান্তর করে। দ্বিতীয়টি কলারের সুযোগ থেকে অন্তর্নিহিত বস্তু স্থানান্তর করে।
has a
আমার কাছে আরও বোঝা যায়]
(এটি একটি প্যারেন্থিকাল নোট। অন্যান্য উত্তরগুলি আগে পড়ুন এবং বুঝুন))
প্রসঙ্গের বাউন্ডগুলি প্রকৃতপক্ষে ভিউ সীমাগুলিকে সাধারণীকরণ করে।
সুতরাং, এই কোডটি একটি সীমাবদ্ধতার সাথে প্রকাশিত হয়েছে:
scala> implicit def int2str(i: Int): String = i.toString
int2str: (i: Int)String
scala> def f1[T <% String](t: T) = 0
f1: [T](t: T)(implicit evidence$1: (T) => String)Int
এটি টাইপ থেকে টাইপ F
করে ফাংশন উপস্থাপনকারী কোনও টাইপের ওরফে সহায়তার সাথে প্রসঙ্গে বাউন্ড দিয়েও প্রকাশ করা যেতে পারে T
।
scala> trait To[T] { type From[F] = F => T }
defined trait To
scala> def f2[T : To[String]#From](t: T) = 0
f2: [T](t: T)(implicit evidence$1: (T) => java.lang.String)Int
scala> f2(1)
res1: Int = 0
প্রবন্ধের আবদ্ধ একটি প্রকারের নির্মাণকারীর সাথে অবশ্যই ব্যবহার করা উচিত * => *
। তবে টাইপ কনস্ট্রাক্টর Function1
ধরনের হয় (*, *) => *
। প্রকার বাছাইয়ের String
জন্য ব্যবহারের জন্য সঠিক ধরণের একটি নির্মাণকারীর ফলন সহ প্রকারভেদটির ব্যবহার আংশিকভাবে প্রকারের সাথে দ্বিতীয় ধরণের পরামিতি প্রয়োগ করে।
কোনও বৈশিষ্ট্যের অভ্যন্তরে প্রকারের উপনামটি ব্যবহার না করে আপনাকে স্ক্যালায় আংশিক প্রয়োগিত প্রকারগুলি সরাসরি প্রকাশ করার অনুমতি দেওয়ার প্রস্তাব রয়েছে। আপনি তখন লিখতে পারেন:
def f3[T : [X](X => String)](t: T) = 0
From
করে To[String]
। আমরা এতে কোনও ধরণের আর্গুমেন্ট সরবরাহ করি না From
, তাই আমরা প্রকারটি নয়, প্রকারের কনস্ট্রাক্টরকে উল্লেখ করি। এই ধরণের কনস্ট্রাক্টর প্রসঙ্গের সীমাবদ্ধ হিসাবে ব্যবহার করতে সঠিক ধরণের * -> *
। এটি প্রকারের T
একটি অন্তর্নিহিত প্যারামিটারের প্রয়োজনের মাধ্যমে টাইপ প্যারামিটারকে সীমাবদ্ধ করে To[String]#From[T]
। প্রকারের উপকরণ এবং ভয়েলা প্রসারিত করুন, আপনার সাথে বাকী রয়েছে Function1[String, T]
।
এটি অন্য প্যারেন্টিথিকাল নোট।
বেন নির্দেশিত হিসাবে , প্রসঙ্গের গণ্ডি একটি টাইপ প্যারামিটার এবং একটি টাইপ শ্রেণীর মধ্যে একটি "হ্যাস-এ" সীমাবদ্ধতা উপস্থাপন করে। অন্যভাবে রাখুন, এটি একটি সীমাবদ্ধতা উপস্থাপন করে যে কোনও নির্দিষ্ট ধরণের শ্রেণীর অন্তর্নিহিত মান বিদ্যমান।
প্রাসঙ্গিক প্রসঙ্গটি ব্যবহার করার সময়, একজনকে প্রায়শই সেই অন্তর্নিহিত মানটির পৃষ্ঠের প্রয়োজন হয়। উদাহরণস্বরূপ, সীমাবদ্ধতা প্রদত্ত T : Ordering
, একজনকে প্রায়শই Ordering[T]
এর সীমাবদ্ধতাটি সন্তুষ্ট করার উদাহরণটির প্রয়োজন হবে । এখানে প্রদর্শিত হিসাবে , implicitly
পদ্ধতি বা কিছুটা বেশি সহায়ক context
পদ্ধতি ব্যবহার করে অন্তর্নিহিত মানটি অ্যাক্সেস করা সম্ভব :
def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) =
xs zip ys map { t => implicitly[Numeric[T]].times(t._1, t._2) }
অথবা
def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) =
xs zip ys map { t => context[T]().times(t._1, t._2) }