Destructuring declaration — یہ کیا ہے، نحو اور Kotlin میں استعمال

مصنف: IT Sectr اشاعت: 2026-06-23 مطالعے کا وقت: 7 منٹ

Destructuring declaration — یہ Kotlin کی وہ صلاحیت ہے جس سے کسی آبجیکٹ کو ایک ہی اظہار میں کئی متغیرات میں تحلیل کیا جا سکتا ہے۔ تعمیر val (name, age) = user ایک ساتھ دو متغیرات کا اعلان کرتی ہے اور انہیں آبجیکٹ کے اجزاء سے قدریں تفویض کرتی ہے۔ Kotlin کی دستاویزات (2026) کے مطابق، ڈی سٹرکچرنگ data class کے ساتھ کام کرتے وقت کوڈ کے حجم کو 30–50% تک کم کرتی ہے۔ Destructuring declaration کوڈ کو زیادہ مختصر اور پڑھنے میں آسان بناتی ہے۔

خلاصہ

  • Destructuring declaration — آبجیکٹ کو متغیرات میں تحلیل کرنے کے لیے val (a, b) = obj نحو
  • ComponentN() — component1()، component2()، component3() اور اسی طرح کے دیگر فنکشنز جو خودکار طور پر بلائے جاتے ہیں
  • Data class پرائمری کنسٹرکٹر میں اعلان کردہ تمام خصوصیات کے لیے خودکار طور پر componentN() تیار کرتی ہے
  • Pair اور Triple — دو اور تین اقدار کے لیے تیار ڈی سٹرکچرنگ کے ساتھ معیاری کلاسز
  • Map.Entry — آسان گردش کے لیے key اور value میں ڈی سٹرکچرنگ کو سپورٹ کرتی ہے

destructuring declaration کیا ہے؟

Destructuring declaration (ڈی سٹرکچرنگ اعلان) — یہ Kotlin کی ایک نحوی تعمیر ہے جس سے کسی کلاس کے نمونے کو ایک ہی اظہار میں کئی متغیرات میں تحلیل کیا جا سکتا ہے۔ بایاں حصہ قوسین میں متغیرات کی فہرست رکھتا ہے، دایاں حصہ — تحلیل کیے جانے والا آبجیکٹ۔ Kotlin ہر متغیر کے لیے خودکار طور پر متعلقہ componentN() فنکشن بلاتا ہے، جہاں N قوسین میں متغیر کا ترتیبی نمبر ہے۔

سب سے زیادہ عام طور پر destructuring declaration data class کے ساتھ استعمال ہوتی ہے۔ Kotlin کمپائلر data class کے لیے خودکار طور پر component1()، component2() اور اسی طرح کے دیگر فنکشنز تیار کرتا ہے — پرائمری کنسٹرکٹر میں خصوصیات کی تعداد کے مطابق۔ عام کلاسز کے لیے جو data موڈیفائر کے بغیر ہیں، componentN() تیار نہیں ہوتے، لیکن انہیں operator کلیدی لفظ کے ساتھ آپریٹر فنکشنز کے طور پر دستی طور پر بیان کیا جا سکتا ہے۔

Destructuring declaration کوڈ کو آسان بنانے کی اپنی صلاحیت کی وجہ سے ایک مقبول نمونہ بن گئی ہے — جوڑوں کے مجموعوں، فنکشنز کے نتائج اور Map کی گردش کے ساتھ کام کرتے وقت۔ person.firstName، person.lastName کی بجائے ڈویلپر val (firstName, lastName) = person لکھتا ہے۔ یہ سطروں کی تعداد کم کرتا ہے اور پڑھنے کی اہلیت بڑھاتا ہے، خاص طور پر لوپس اور لیمبڈا میں۔

Kotlin میں ڈی سٹرکچرنگ کیسے کام کرتی ہے؟

val (a, b) = obj تعمیر ملنے پر Kotlin کمپائلر یہ کوڈ تیار کرتا ہے: val a = obj.component1(); val b = obj.component2()۔ اگر متغیرات var کے ساتھ اعلان کیے گئے ہوں تو var تفویضات تیار ہوتی ہیں۔ ہر متغیر کی قسم متعلقہ componentN() فنکشن کے لوٹائے جانے والے نتائج کی قسم سے اخذ کی جاتی ہے۔ اس کا مطلب ہے کہ destructuring declaration مکمل طور پر ٹائپ سیف ہے اور کمپائیلیشن کے مرحلے پر جانچی جاتی ہے۔

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // ڈی سٹرکچرنگ: component1()، component2()، component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName، $age سال پرانا")
}

لِسٹنگ میں Person تین خصوصیات کے ساتھ ایک data class ہے۔ Kotlin component1() → firstName، component2() → lastName، component3() → age تیار کرتا ہے۔ اظہار val (firstName, lastName, age) = person ان فنکشنز کو بلاتا ہے اور نتائج تفویض کرتا ہے۔ اہم بات: متغیرات کے نام خصوصیات کے ناموں سے مختلف ہو سکتے ہیں — کمپائلر صرف componentN() کی ترتیب اور ان کی اقسام پر غور کرتا ہے۔ صرف پہلی N خصوصیات کو تحلیل کیا جا سکتا ہے، باقی کو نظر انداز کرتے ہوئے۔

data class اور معیاری اقسام کی ڈی سٹرکچرنگ

Data class destructuring declaration کے لیے بنیادی امیدوار ہے۔ ہر data class پرائمری کنسٹرکٹر کی تمام خصوصیات کے لیے خودکار طور پر componentN() حاصل کرتی ہے۔ componentN() کی ترتیب خصوصیات کے اعلان کی ترتیب سے مطابقت رکھتی ہے۔ اس کا مطلب ہے کہ data class میں فیلڈز کی ترتیب تبدیل کرنے سے ڈی سٹرکچرنگ میں متغیرات کی ترتیب بدل جاتی ہے — جو غیر محسوس بگز کا سبب بن سکتی ہے۔

kotlin
// Pair ڈی سٹرکچرنگ
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Triple ڈی سٹرکچرنگ
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// لوپ میں Map.Entry
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair اور Triple دو اور تین اجزاء پر تیار ڈی سٹرکچرنگ کے ساتھ معیاری کلاسز ہیں۔ Pair اکثر فنکشنز کے لوٹائے جانے والے نتائج کی قسم کے طور پر استعمال ہوتا ہے جنہیں علیحدہ data class بنائے بغیر دو متعلقہ اقدار لوٹانی ہوتی ہیں۔ Map.Entry پر for لوپ میں (k, v) = entry تعمیر component1() اور component2() کے ذریعے کلید اور قدر کو ڈی سٹرکچر کرتی ہے۔ یہ Kotlin میں Map کی گردش کا معیاری نمونہ ہے جو key اور value کے واضح کالز کو مکمل طور پر بدل دیتا ہے۔

غیر استعمال شدہ متغیرات کے لیے انڈر سکور

اگر ڈی سٹرکچرنگ کے دوران کچھ اجزاء کی ضرورت نہ ہو تو Kotlin انہیں انڈر سکور _ سے بدلنے کی اجازت دیتا ہے۔ یہ پڑھنے کی اہلیت بہتر کرتا ہے — قاری فوراً دیکھتا ہے کہ جزو کو نظر انداز کیا جا رہا ہے۔ اس کے علاوہ _ کا استعمال غیر ابتدائی شدہ متغیر تک اتفاقی رسائی کو روکتا ہے: کمپائلر _ کے لیے کوئی متغیر نہیں بناتا، جس سے غیر استعمال شدہ متغیرات کے بارے میں انتباہات ختم ہو جاتے ہیں۔

kotlin
data class Order(
    val id: Long,
    val customerName: String,
    val amount: Double,
    val status: String
)

fun process(orders: List<Order>) {
    for ((id, _, amount) in orders) {
        println("آرڈر $id: $amount")
    }
}

لِسٹنگ میں Order کی چار خصوصیات ہیں، لیکن لوپ میں صرف id اور amount کی ضرورت ہے۔ customerName کی جگہ انڈر سکور کمپائلر کو کہتا ہے کہ component2() چھوڑ دو۔ Kotlin component2() کو نہیں بلاتا اور اس جزو کے لیے کوئی متغیر نہیں بناتا۔ اہم: انڈر سکور صرف destructuring declaration میں استعمال کیا جا سکتا ہے، لیکن data class کنسٹرکٹر میں نہیں۔ اگر کئی اجزاء لگاتار چھوڑے جائیں تو ہر ایک کے لیے اپنا انڈر سکور ہوتا ہے۔

اپنی کلاسز کے لیے componentN() بنانا

data موڈیفائر کے بغیر کلاسز کے لیے operator کلیدی لفظ شامل کرکے componentN() کو دستی طور پر بیان کیا جا سکتا ہے۔ یہ کسی بھی کلاس کے ساتھ destructuring declaration استعمال کرنے کی اجازت دیتا ہے، بشمول تیسری پارٹی کی کلاسز جن کے سورس کوڈ میں تبدیلی ممکن نہیں — operator کے ساتھ extension فنکشن لکھنا کافی ہے۔ یہ نقطہ نظر خاص طور پر لائبریری کلاسز اور Java کوڈ کی کلاسز کے لیے مفید ہے جن کے پاس خودکار componentN() نہیں ہیں۔

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// getters کے ساتھ Java کلاس کے لیے
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("حل: ${w}x${h}")
}

مثال میں Rect data کے بغیر ایک عام کلاس ہے۔ operator fun component1() = width اور component2() = height کے ساتھ extension فنکشنز ڈی سٹرکچرنگ کے لیے سپورٹ شامل کرتی ہیں۔ اسی طرح java.awt.Dimension کے لیے: Dimension پر operator extension اسے width اور height میں تحلیل کرنے کی اجازت دیتا ہے۔ حد: destructuring declaration کے لیے اجزاء کی زیادہ سے زیادہ تعداد 5 ہے۔ نظریاتی طور پر component6() اور اس سے آگے بیان کیا جا سکتا ہے، لیکن Kotlin قوسین میں 6+ متغیرات کے لیے متعلقہ نحو تیار نہیں کرے گا۔

اکثر پوچھے جانے والے سوالات

کیا data class ہمیشہ ڈی سٹرکچرنگ کو سپورٹ کرتی ہے؟

جی ہاں، ہر data class پرائمری کنسٹرکٹر کی تمام خصوصیات کے لیے خودکار طور پر componentN() حاصل کرتی ہے۔ کلاس کے جسم میں اعلان کردہ خصوصیات (بغیر val/var کے کنسٹرکٹر کے ذریعے) componentN() پیدا نہیں کرتیں۔

متغیرات کی تعداد کے میل نہ کھانے پر کیا ہوگا؟

اگر val (a, b, c) = obj میں آبجیکٹ کے پاس صرف دو component فنکشنز ہوں تو کمپائلر غلطی دیتا ہے۔ اگر متغیرات کم ہوں (val (a) = pair) تو Kotlin صرف component1() کو بلائے گا اور component2() کو نظر انداز کر دے گا — کوئی غلطی نہیں ہوگی۔

کیا Map کو بغیر لوپ کے ڈی سٹرکچر کیا جا سکتا ہے؟

جی ہاں، Map.Entry ڈی سٹرکچرنگ کو سپورٹ کرتی ہے: val (key, value) = map.entries.first()۔ پوری Map کو ایک ساتھ ڈی سٹرکچر نہیں کیا جا سکتا — صرف عنصر بہ عنصر، for لوپ میں یا اٹریٹر کے ذریعے۔

کیا لیمبڈا میں ڈی سٹرکچرنگ کام کرتی ہے؟

جی ہاں، Kotlin لیمبڈا کے پیرامیٹرز میں ڈی سٹرکچرنگ کو سپورٹ کرتا ہے: map.forEach { (k, v) -> ... }۔ لیمبڈا پیرامیٹرز میں data class کے لیے پیرامیٹر کے گرد اضافی قوسین شامل کرنی ہوتی ہیں۔

ڈی سٹرکچرنگ کی زیادہ سے زیادہ جسامت کیا ہے؟

Kotlin destructuring declaration میں 5 تک متغیرات کو سپورٹ کرتا ہے۔ اگر پانچ سے زیادہ خصوصیات کو تحلیل کرنا ہو تو انہیں اندرونی data class میں ملا دیں یا ایک متغیر کے اندر Pair/Triple استعمال کریں۔

خلاصہ

  • Destructuring declaration — val (a, b) = obj نحو، جو آبجیکٹ کو ایک اظہار میں کئی متغیرات میں تحلیل کرتا ہے
  • ComponentN() — component1()، component2()، ... فنکشنز جو ڈی سٹرکچرنگ پر کمپائلر خودکار طور پر بلاتا ہے
  • Data class پرائمری کنسٹرکٹر کی تمام خصوصیات کے لیے خودکار طور پر componentN() تیار کرتی ہے
  • Pair اور Triple — 2 اور 3 اجزاء پر تیار ڈی سٹرکچرنگ کے ساتھ معیاری کلاسز
  • انڈر سکور _ متغیر بنائے بغیر غیر استعمال شدہ اجزاء کی جگہ لیتا ہے
  • Operator componentN() extension فنکشنز میں Java سمیت کسی بھی کلاس کو ڈی سٹرکچرنگ شامل کرتا ہے
  • Map.Entry for ((k, v) in map) لوپ میں — لغت کی گردش کے لیے Kotlin کا معیاری محاوراتی نمونہ

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں