Numeric
Interval
ऑब्जेक्ट में टाइप क्लास का उपयोग एक प्रकार पैरामीटर T
है जो कहीं भी अपने संलग्न क्षेत्र में बाध्य होना चाहिए। Interval
, एक अद्वितीय निरंतर मूल्य होने के नाते, बाध्यकारी प्रदान नहीं कर सकता है। इस विशिष्ट समस्या का
एक समाधान Interval
वर्ग के रूप में आम उदाहरण के तरीकों, जो मामले में वे T
के बंधन और के साथ जुड़े Numeric
उदाहरण साझा करेंगे में अपने union
और intersect
संचालन की परिभाषा को स्थानांतरित करने के होगा वर्ग के बाकी,
case class Interval[T : Numeric](from: T, to: T) {
import Numeric.Implicits._
import Ordering.Implicits._
def mid: Double = (from.toDouble + to.toDouble)/2.0
def union(interval2: Interval[T]) =
Interval(this.from min interval2.from, this.to max interval2.to)
def intersect(interval2: Interval[T]) =
Interval(this.from max interval2.from, this.to min interval2.to)
}
अगर, हालांकि, आप इन आपरेशनों की परिभाषा रखना पसंद करते हैं अलग Interval
वर्ग, एक दृष्टिकोण से निहित बॉयलरप्लेट की राशि है कि आप throug का पीछा करने की जरूरत को कम करने के लिए एच आपके एपीआई संख्यात्मक [टी] के संदर्भ में अपने उच्च स्तर के वर्ग कक्षाओं को परिभाषित करना है। उदाहरण के लिए,
// Type class supplying union and intersection operations for values
// of type Interval[T]
class IntervalOps[T : Numeric] {
import Ordering.Implicits._
def union(interval1: Interval[T], interval2: Interval[T]) =
Interval[T](interval1.from min interval2.from, interval1.to max interval2.to)
def intersect(interval1: Interval[T], interval2: Interval[T]) =
Interval[T](interval1.from max interval2.from, interval1.to min interval2.to)
}
implicit def mkIntervalOps[T : Numeric] = new IntervalOps[T]
जो उपयोग कैसा दिखेगा में,
def use[T](i1 : Interval[T], i2 : Interval[T])(implicit ops : IntervalOps[T]) = {
import ops._
val i3 = union(i1, i2)
val i4 = intersect(i1, i2)
(i3, i4)
}
एक तीसरा विकल्प इन दो, एक अंतर्निहित परिभाषा का उपयोग अतिरिक्त तरीकों के साथ मूल वर्ग को बेहतर बनाने के, को जोड़ती है
class IntervalOps[T : Numeric](interval1 : Interval[T]) {
import Ordering.Implicits._
def union(interval2: Interval[T]) =
Interval[T](interval1.from min interval2.from, interval1.to max interval2.to)
def intersect(interval2: Interval[T]) =
Interval[T](interval1.from max interval2.from, interval1.to min interval2.to)
}
implicit def enrichInterval[T : Numeric](interval1 : Interval[T]) =
new IntervalOps[T](interval1)
type Ops[T] = Interval[T] => IntervalOps[T]
फिर उपयोग में,
def use[T](i1 : Interval[T], i2 : Interval[T])(implicit ops : Ops[T]) = {
val i3 = i1 union i2
val i4 = i1 intersect i2
(i3, i4)
}
धन्यवाद। अच्छा ब्रेवटी मैंने इस संदर्भ को कभी भी विचार नहीं देखा है। कोई ऐसी चीजें कहां से सीखता है? मैंने स्कैला पर एक पुस्तक पढ़ी, लेकिन मुझे संदर्भ सीमा याद नहीं है। –
उदाहरण के लिए देखें [स्कैला में "संदर्भ बाध्य" क्या है?] (Http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala)। – Jesper