बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala · पाठ

अपारदर्शी प्रकार

शून्य-लागत अमूर्तीकरण

पाठ 3, कुल 4 में से13 चरण

अपारदर्शी प्रकार, CoddyKit पर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Opaque Types क्या हैं?

Opaque types Scala 3 की ऐसी सुविधा हैं जो zero-cost abstractions बनाने के लिए उपयोग होती है। वे compile time पर अलग type देते हैं, लेकिन runtime wrapping के बिना underlying type में compile हो जाते हैं।

  • Wrapper class की type safety।
  • Zero allocation overhead।
object Distances:
  opaque type Meters = Double

object Main:
  def main(args: Array[String]): Unit =
    println("Opaque types compile to their underlying type")

Opaque Type घोषित करना

किसी object या class के अंदर opaque type घोषित करें। उस scope के बाहर Meters और Double को अलग-अलग types माना जाता है।

object Distances:
  opaque type Meters = Double
  def meters(d: Double): Meters = d
  def toDouble(m: Meters): Double = m

object Main:
  def main(args: Array[String]): Unit =
    val d = Distances.meters(5.0)
    println(Distances.toDouble(d))

Opacity की सीमा

Defining scope के अंदर opaque type और उसका underlying type परस्पर बदले जा सकते हैं। बाहर, केवल opaque type दिखाई देता है, इसलिए जहाँ Meters आवश्यक हो वहाँ आप गलती से raw Double नहीं दे सकते।

object Distances:
  opaque type Meters = Double
  def apply(d: Double): Meters = d
  def show(m: Meters): String = s"$m m"

object Main:
  def main(args: Array[String]): Unit =
    val m = Distances(10.0)
    println(Distances.show(m))

Extension Methods जोड़ना

उसी scope में define किए गए extension methods से opaque types को behavior दें। Callers को underlying type उजागर किए बिना सुविधाजनक operations मिलते हैं।

object Distances:
  opaque type Meters = Double
  def apply(d: Double): Meters = d
  extension (m: Meters)
    def +(other: Meters): Meters = m + other
    def value: Double = m

object Main:
  def main(args: Array[String]): Unit =
    val total = Distances(3.0) + Distances(4.0)
    println(total.value)

Mixups रोकना

सबसे बड़ा लाभ यह है कि एक ही underlying type पर आधारित दो opaque types असंगत होते हैं। Meters को Kilometers समझने की गलती नहीं हो सकती, भले ही दोनों Doubles हों।

object Units:
  opaque type Meters = Double
  opaque type Kilometers = Double
  def m(d: Double): Meters = d
  def km(d: Double): Kilometers = d
  def toMeters(k: Kilometers): Meters = k * 1000

object Main:
  def main(args: Array[String]): Unit =
    val far = Units.km(2.0)
    println(Units.toMeters(far))

Bounds वाले Opaque Types

आप <: के साथ opaque type को upper bound दे सकते हैं। इससे exact representation छिपाए रखते हुए public API का एक भाग उजागर होता है।

object Ids:
  opaque type UserId <: Int = Int
  def apply(i: Int): UserId = i

object Main:
  def main(args: Array[String]): Unit =
    val id = Ids(99)
    println(id + 1)

Validation के साथ Smart Construction

अपारदर्शी प्रकारों को सत्यापन करने वाली फैक्टरी के साथ मिलाकर यह सुनिश्चित करें कि मान हमेशा मान्य हों। कंस्ट्रक्टर निजी रहता है; केवल सत्यापित फैक्टरी सार्वजनिक होती है।

object Ages:
  opaque type Age = Int
  def of(i: Int): Option[Age] =
    if i >= 0 && i < 150 then Some(i) else None
  extension (a: Age) def value: Int = a

object Main:
  def main(args: Array[String]): Unit =
    println(Ages.of(30).map(_.value))
    println(Ages.of(-1))

रनटाइम लागत शून्य

वैल्यू क्लास या केस क्लास रैपर के विपरीत, अपारदर्शी प्रकार रनटाइम पर कोई ऑब्जेक्ट नहीं बनाता। JVM में Meters की List वास्तव में doubles की सूची होती है, इसलिए बॉक्सिंग नहीं होती।

object Temps:
  opaque type Celsius = Double
  def c(d: Double): Celsius = d
  extension (t: Celsius) def value: Double = t

object Main:
  def main(args: Array[String]): Unit =
    val readings = List(Temps.c(20.0), Temps.c(21.5))
    println(readings.map(_.value).sum)

अपारदर्शी प्रकार बनाम प्रकार उपनाम

साधारण type X = Y उपनाम पारदर्शी होता है: X और Y हर जगह पूरी तरह एक-दूसरे के स्थान पर उपयोग किए जा सकते हैं। अपारदर्शी प्रकार अपने क्षेत्र के बाहर इस समानता को छिपाता है और वास्तविक प्रकार-सुरक्षा प्रदान करता है।

object Demo:
  type Name = String          // transparent alias
  opaque type Email = String  // opaque
  def email(s: String): Email = s
  extension (e: Email) def raw: String = e

object Main:
  def main(args: Array[String]): Unit =
    val e = Demo.email("a@b.com")
    println(e.raw)

अपारदर्शी प्रकार बनाम केस क्लास रैपर

case class Meters(value: Double) जैसा केस क्लास रैपर भी प्रकार-सुरक्षा देता है, लेकिन एक ऑब्जेक्ट बनाता है। अपारदर्शी प्रकार कच्चे प्रकार जैसी कार्यक्षमता के साथ वही सुरक्षा देते हैं।

object Money:
  opaque type Cents = Long
  def cents(n: Long): Cents = n
  extension (c: Cents)
    def +(o: Cents): Cents = c + o
    def value: Long = c

object Main:
  def main(args: Array[String]): Unit =
    val total = Money.cents(150) + Money.cents(50)
    println(total.value)

अपारदर्शी प्रकारों का उपयोग कब करें

जब आपको अत्यधिक उपयोग वाले पथों या बड़े संग्रहों में मजबूत डोमेन-टाइपिंग चाहिए, तब अपारदर्शी प्रकारों का उपयोग करें।

  • मात्राओं में अंतर करें (Meters बनाम Seconds)।
  • सत्यापित अपरिवर्तनीय शर्तें लागू करें।
  • रैपरों की ऑब्जेक्ट बनाने वाली अतिरिक्त लागत से बचें।
object Geo:
  opaque type Latitude = Double
  def lat(d: Double): Option[Latitude] =
    if d >= -90 && d <= 90 then Some(d) else None
  extension (l: Latitude) def value: Double = l

object Main:
  def main(args: Array[String]): Unit =
    println(Geo.lat(41.0).map(_.value))

त्वरित जाँच

अपारदर्शी प्रकारों की अपनी समझ जाँचें।

पुनरावलोकन

आपने Scala 3 के अपारदर्शी प्रकार सीखे।

  • opaque type X = Y अपने क्षेत्र के बाहर समानता को छिपाता है।
  • API के लिए फैक्ट्रियाँ और extension विधियाँ उपलब्ध कराएँ।
  • एक ही आधार पर बने अलग-अलग अपारदर्शी प्रकार एक-दूसरे के साथ संगत नहीं होते।
  • <: के साथ वैकल्पिक ऊपरी सीमाएँ API का आंशिक भाग दिखाती हैं।
  • केस क्लास रैपरों के विपरीत, रनटाइम लागत शून्य होती है।
object Ids:
  opaque type OrderId = String
  def apply(s: String): OrderId = s
  extension (o: OrderId) def raw: String = o

object Main:
  def main(args: Array[String]): Unit =
    val id = Ids("ORD-1")
    println(id.raw)
शुरुआत निःशुल्क

एआई शिक्षक के साथ Scala सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
39
पाठ
143

अक्सर पूछे जाने वाले प्रश्न

क्या “अपारदर्शी प्रकार” पाठ निःशुल्क है?

हाँ—“अपारदर्शी प्रकार” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“अपारदर्शी प्रकार” में मैं क्या सीखूँगा?

शून्य-लागत अमूर्तीकरण आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“अपारदर्शी प्रकार” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Significant Indentation
  2. Scala 3 में Enums
  3. अपारदर्शी प्रकार
  4. यूनियन और इंटरसेक्शन प्रकार
← बैकएंड इंजीनियरिंग और कार्यात्मक प्रोग्रामिंग के लिए Scala पर वापस जाएँ