اسکوپ فنکشنز — یہ کیا ہیں، اقسام اور Kotlin میں استعمال

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

Kotlin میں اسکوپ فنکشنز پانچ معیاری لائبریری فنکشنز (let، run، with، apply، also) ہیں جو کسی آبجیکٹ کے سیاق و سباق میں کوڈ بلاک پر عمل کرتی ہیں۔ یہ آبجیکٹ تک رسائی کے طریقہ (it یا this کے ذریعے) اور واپسی کی قدر (سیاق آبجیکٹ یا lambda نتیجہ) میں مختلف ہوتی ہیں۔ Kotlin دستاویزات (2026) کے مطابق، صحیح اسکوپ فنکشن کا انتخاب بوائلرپلیٹ کوڈ کو 25–40% تک کم کرتا ہے۔ اسکوپ فنکشنز آبجیکٹ کی ابتدا، ترتیب اور تبدیلیوں کو اعلانیہ انداز میں لکھنے میں مدد دیتی ہیں۔

اہم نکات

  • اسکوپ فنکشنز — آبجیکٹ سیاق میں کام کرنے کے لیے پانچ Kotlin فنکشنز (let، run، with، apply، also)
  • this کے ذریعے سیاق — run، with، apply this استعمال کرتی ہیں، آبجیکٹ کے میتھڈز کو براہ راست کال کرنے دیتی ہیں
  • it کے ذریعے سیاق — let اور also واضح نام کے ساتھ آبجیکٹ کو it پیرامیٹر کے طور پر منتقل کرتی ہیں
  • آبجیکٹ کی واپسی — apply اور also کالوں کی زنجیر کے لیے سیاق آبجیکٹ لوٹاتی ہیں
  • نتیجے کی واپسی — let، run اور with lambda کا آخری اظہار لوٹاتی ہیں

اسکوپ فنکشنز کیا ہیں؟

اسکوپ فنکشنز پانچ فنکشنز (let، run، with، apply، also) کا ایک مجموعہ ہے جو Kotlin معیاری لائبریری میں شامل ہیں۔ ان میں سے ہر ایک lambda لیتی ہے اور عارضی طور پر دائرہ کار کو تبدیل کرتی ہے تاکہ lambda کے اندر کوڈ کسی مخصوص آبجیکٹ کے سیاق میں عمل کرے۔ یہ متعدد کالوں کے لیے آبجیکٹ کا نام دہرانے سے روکتا ہے اور متعلقہ کارروائیوں کو ایک بلاک میں گروپ کرتا ہے۔

دو اہم خصوصیات اسکوپ فنکشنز کو ممتاز کرتی ہیں: سیاق آبجیکٹ تک رسائی کا طریقہ (this یا it کے ذریعے) اور واپسی کی قدر (سیاق آبجیکٹ خود یا lambda نتیجہ)۔ this کے ذریعے رسائی آبجیکٹ کو ایک پوشیدہ وصول کنندہ بناتی ہے — میتھڈز اور خصوصیات بغیر کسی سابقہ کے کال ہوتی ہیں۔ it کے ذریعے رسائی آبجیکٹ کو lambda کے واضح پیرامیٹر کے طور پر منتقل کرتی ہے۔ آبجیکٹ واپس کرنے سے زنجیر بنانا ممکن ہوتا ہے، نتیجہ واپس کرنے سے تبدیل شدہ قدر تفویض کی جا سکتی ہے۔

تاریخی طور پر، اسکوپ فنکشنز کلاسک Builder پیٹرن اور ابتدا کے لیے عارضی متغیرات کے متبادل کے طور پر ابھریں۔ علیحدہ builder کلاس بنانے کے بجائے، ڈویلپر apply { خصوصیت1 = ...; خصوصیت2 = ... } لکھتا ہے۔ یہ کوڈ کی مقدار کو کم کرتا ہے اور ابتدا کو مزید پڑھنے کے قابل بناتا ہے۔ Kotlin ماحولیاتی نظام میں، اسکوپ فنکشنز تمام فریم ورکس اور لائبریریوں میں ایک معیاری زبان کے محاورے کے طور پر استعمال ہوتی ہیں۔

اسکوپ فنکشنز کا موازنہ: this بمقابلہ it، آبجیکٹ واپسی بمقابلہ نتیجہ

صحیح اسکوپ فنکشن کا انتخاب دو سوالوں سے طے ہوتا ہے: کیا آپ آبجیکٹ تک رسائی کے لیے this یا it استعمال کرنا چاہتے ہیں، اور کیا آپ آبجیکٹ خود لوٹانا چاہتے ہیں یا lambda کا نتیجہ۔ دو بائنری خصوصیات کا امتزاج چار ممکنہ اختیارات دیتا ہے، اور with ایک خاص مقام رکھتا ہے جو واحد فنکشن ہے جو توسیع نہیں ہے۔

فنکشنرسائیواپسیتوسیع؟عام منظر
letitlambda نتیجہہاںتبدیلی، null جانچ
runthislambda نتیجہہاںسیاق کے ساتھ حساب
withthislambda نتیجہنہیںکالوں کو گروپ کرنا
applythisسیاق آبجیکٹہاںخصوصیات کی ابتدا
alsoitسیاق آبجیکٹہاںضمنی اثرات، لاگنگ

نئی قدر واپس کیے بغیر آبجیکٹ ترتیب دینے کے لیے، apply (this کے ذریعے رسائی) یا also (it کے ذریعے رسائی) استعمال کریں۔ آبجیکٹ کی بنیاد پر نئی قدر کا حساب لگانے کے لیے، let (it کے ذریعے رسائی) یا run (this کے ذریعے رسائی) استعمال کریں۔ زنجیر کے بغیر کالوں کو گروپ کرنے کے لیے، with استعمال کریں۔ اس طریقے پر عمل کرنے سے کوڈ Kotlin سے واقف دوسرے ڈویلپرز کے لیے پیش قیاسی بن جاتا ہے۔

apply اور also: آبجیکٹ واپسی کے ساتھ ترتیب

apply ایک اسکوپ فنکشن ہے جو سیاق آبجیکٹ لوٹاتا ہے اور اسے this کے ذریعے رسائی فراہم کرتا ہے۔ یہ تخلیق کے بعد آبجیکٹ کی خصوصیات کو شروع کرنے کے لیے مثالی آلہ ہے۔ apply بلاک کے اندر، آبجیکٹ کا نام دہرائے بغیر خصوصیات سیٹ کی جا سکتی ہیں۔ میتھڈ خود آبجیکٹ لوٹاتا ہے، جس سے apply کو زنجیروں میں شامل کرنے یا ابتدائیہ میں استعمال کرنے کی اجازت ملتی ہے۔

kotlin
data class ServerConfig(
    var host: String = "localhost",
    var port: Int = 8080,
    var useTls: Boolean = false
)

val config = ServerConfig().apply {
    host = "api.example.com"
    port = 443
    useTls = true
}

فہرست میں apply this کے ذریعے براہ راست خصوصیات تک رسائی حاصل کرکے ServerConfig کو ترتیب دیتا ہے (this حذف کر دیا گیا ہے)۔ Apply کے بغیر config.host = ..., config.port = ... لکھنا پڑتا — اسی متغیر کے تین دہرائے گئے حوالہ جات۔ آبجیکٹ لوٹانے سے ترتیب کے نتیجے کو val config میں محفوظ کیا جا سکتا ہے۔ also، apply کے برعکس، it کے ذریعے آبجیکٹ منتقل کرتا ہے اور ضمنی اثرات کے لیے موزوں ہے۔

kotlin
fun saveUser(user: User) {
    validate(user).also { result ->
        println("توثیق کا نتیجہ: $result")
    }
    val savedUser = user.also {
        log("Saving user ${it.id}")
        database.save(it)
    }
}

مثال میں also لاگنگ کے لیے استعمال ہوا ہے — اصل آبجیکٹ لوٹاتے ہوئے، یہ آبجیکٹ کو تبدیل کیے بغیر ایک ضمنی اثر (پیغام کی نمائش) انجام دیتا ہے۔ یہ ایک زنجیر ہے: validate(user) User لوٹاتا ہے، also نتیجہ لاگ کرتا ہے اور صارف کو آگے منتقل کرتا ہے۔ also مجموعوں میں عناصر شامل کرنے یا تبدیلی کی زنجیر کے درمیان ڈیبگ کرنے کے لیے بھی مفید ہے۔

let اور run: تبدیلیاں اور حسابات

let ایک اسکوپ فنکشن ہے جو lambda کا نتیجہ لوٹاتا ہے اور it کے ذریعے سیاق منتقل کرتا ہے۔ یہ null محفوظ تبدیلیوں کے لیے بنیادی فنکشن ہے: اگر آبجیکٹ nullable ہے، تو ?.let { } کا امتزاج صرف غیر null اقدار کے لیے بلاک پر عمل کرے گا۔ let عارضی متغیرات کے دائرہ کار کو محدود کرنے اور ایک قسم سے دوسری قسم میں map جیسی تبدیلیوں کے لیے بھی استعمال ہوتا ہے۔

kotlin
fun findUser(id: Int): User?

val displayName = findUser(42)?.let { user ->
    "${user.name} (${user.email})"
} ?: "Unknown user"

// مجموعہ تبدیلی کے ساتھ let
val numbers = listOf("1", "2", "3")
val parsed = numbers.firstOrNull()?.let {
    it.toIntOrNull()
} ?: 0

پہلی مثال میں let ?. کے ذریعے کال کیا گیا ہے — بلاک صرف اس وقت عمل کرتا ہے جب findUser نے غیر null واپس کیا ہو۔ Lambda it کے ذریعے user لیتی ہے (واضحیت کے لیے نام تبدیل کیا جا سکتا ہے) اور ایک فارمیٹ شدہ سٹرنگ لوٹاتی ہے۔ اگر صارف نہ ملے تو Elvis آپریٹر ?: ایک ڈیفالٹ قدر فراہم کرتا ہے۔ دوسری مثال میں let ایک سٹرنگ کو ممکنہ null کے ساتھ نمبر میں تبدیل کرتا ہے۔

run this کے ذریعے رسائی کے ساتھ let کا مشابہ ہے، جو lambda کا نتیجہ لوٹاتا ہے۔ run ان حسابات کے لیے آسان ہے جنہیں آبجیکٹ سیاق کی ضرورت ہوتی ہے لیکن وہ نئی قدر لوٹاتے ہیں۔ آبجیکٹ کے بغیر run() کال کرنا (run { ... } کی طرح) متغیرات کے لیے ایک عارضی دائرہ کار تخلیق کرتا ہے۔ with this کے ذریعے رسائی کے ساتھ ایک غیر توسیع ہے، جو زنجیر کے بغیر کالوں کو گروپ کرنے کے لیے موزوں ہے۔

kotlin
// سیاق پر مبنی حساب کے طور پر run
val transformed = listOf(1, 2, 3).run {
    filter { it > 1 }.map { it * 10 }
}
println(transformed) // [20, 30]

// کالوں کو گروپ کرنے کے لیے with
val info = with(StringBuilder()) {
    append("Name: ")
    append("Alice")
    toString()
}

مثال میں فہرست پر run فلٹرنگ اور میپنگ کا نتیجہ لوٹاتا ہے — تبدیلی خود، فہرست نہیں۔ with StringBuilder کو دلیل کے طور پر لیتا ہے (نقطہ کے ذریعے نہیں) اور اندر this کے ساتھ کام کرتا ہے: append، append، toString۔ with کا نتیجہ info سٹرنگ ہے۔ run اور with کے درمیان انتخاب اکثر ساپیکش ہوتا ہے، لیکن with ترجیحی ہے جب آبجیکٹ زنجیر کے بغیر کسی اور جگہ سے منتقل کیا جائے۔

with: توسیع کے بغیر سیاق

with دوسرے اسکوپ فنکشنز سے اس لحاظ سے مختلف ہے کہ یہ ایک توسیعی فنکشن نہیں ہے۔ یہ آبجیکٹ کو پہلی دلیل اور lambda کو دوسری دلیل کے طور پر لیتا ہے۔ lambda کے اندر آبجیکٹ this کے ذریعے قابل رسائی ہے۔ with نتیجہ محفوظ کیے بغیر آبجیکٹ کے میتھڈ کالوں کو گروپ کرنے یا جب متعدد خصوصیات پڑھنے کے لیے عارضی طور پر سیاق میں “داخل” ہونے کی ضرورت ہو تو آسان ہے۔

kotlin
val user = User("Alice", "alice@example.com", "Admin")

val summary = with(user) {
    "User $name has role $role and email $email"
}
println(summary)

// UI جزو کی ابتدا کے لیے with
with(TextView(context)) {
    text = "Hello"
    textSize = 18.0f
    setTextColor(Color.BLUE)
}

پہلی مثال میں with this کے ذریعے براہ راست user کی خصوصیات تک رسائی حاصل کرکے summary سٹرنگ بناتا ہے۔ with کے بغیر "User ${user.name} has role ${user.role}" لکھنا پڑتا — user کی تکرار۔ دوسری مثال میں with TextView کی ترتیب کو گروپ کرتا ہے: تمام میتھڈز اور خصوصیات تکرار کے بغیر ایک آبجیکٹ پر کال ہوتی ہیں۔ with کی خامی — زنجیر میں استعمال کرنے سے قاصر، کیونکہ یہ توسیع نہیں ہے اور سیاق آبجیکٹ نہیں لوٹاتا۔

اکثر پوچھے گئے سوالات

آبجیکٹ کی ابتدا کے لیے کون سا اسکوپ فنکشن منتخب کریں؟

apply استعمال کریں — یہ آبجیکٹ لوٹاتا ہے اور this کے ذریعے رسائی فراہم کرتا ہے، جس سے آبجیکٹ کا نام دہرائے بغیر خصوصیات سیٹ کی جا سکتی ہیں۔ also موزوں ہے اگر آبجیکٹ کی خصوصیات سے فرق کرنے کے لیے واضح it پیرامیٹر کی ضرورت ہو۔

let، run سے کیسے مختلف ہے؟

let سیاق کو it (واضح پیرامیٹر) کے ذریعے منتقل کرتا ہے، run — this (پوشیدہ وصول کنندہ) کے ذریعے۔ let null جانچ اور تبدیلیوں کے لیے آسان ہے، run — سیاق کے ساتھ حسابات کے لیے۔ دونوں lambda کا نتیجہ لوٹاتے ہیں۔

apply کی بجائے with کب استعمال کریں؟

with توسیع نہیں ہے — یہ آبجیکٹ کو دلیل کے طور پر لیتا ہے۔ with کو کالوں کو گروپ کرنے کے لیے استعمال کریں جب زنجیر کی ضرورت نہ ہو۔ apply ایک توسیع ہے جو آبجیکٹ لوٹاتا ہے، ابتدائیہ اور builder پیٹرن میں آسان ہے۔

کیا ایک اسکوپ فنکشن کو دوسرے کے اندر رکھا جا سکتا ہے؟

ہاں، لیکن this سے محتاط رہیں — اندرونی this الجھن پیدا کرتا ہے۔ بیرونی آبجیکٹ کا حوالہ دیتے وقت ابہام سے بچنے کے لیے اندرونی سیاق کے لیے واضح ناموں کے ساتھ let یا also استعمال کریں۔

سب سے زیادہ کارکردگی والا اسکوپ فنکشن کون سا ہے؟

تمام اسکوپ فنکشنز inline ہیں، اس لیے یہ گمنام کلاسوں سے اوور ہیڈ پیدا نہیں کرتے۔ ان کے درمیان کارکردگی کا فرق نہ ہونے کے برابر ہے۔ انتخاب رفتار کی بجائے پڑھنے کی اہلیت اور روایات پر مبنی ہونا چاہیے۔

خلاصہ

  • اسکوپ فنکشنز — آبجیکٹ سیاق میں کوڈ پر عمل کرنے کے لیے پانچ Kotlin ان لائن فنکشنز (let، run، with، apply، also)
  • apply this کے ذریعے رسائی کے ساتھ سیاق آبجیکٹ لوٹاتا ہے — خصوصیات کی ابتدا کے لیے مثالی
  • also it کے ذریعے رسائی کے ساتھ سیاق آبجیکٹ لوٹاتا ہے — لاگنگ اور ضمنی اثرات کے لیے موزوں
  • let it کے ذریعے رسائی کے ساتھ lambda نتیجہ لوٹاتا ہے — null محفوظ تبدیلیوں کی بنیاد
  • run this کے ذریعے رسائی کے ساتھ lambda نتیجہ لوٹاتا ہے — سیاق کے ساتھ حسابات کے لیے آسان
  • with توسیع نہیں ہے اور lambda نتیجہ لوٹاتا ہے — زنجیر کے بغیر کالوں کو گروپ کرنے کے لیے موزوں
  • خصوصیات کا امتزاج (this/it اور آبجیکٹ/نتیجہ واپسی) ہر کام کے لیے اسکوپ فنکشن کا انتخاب طے کرتا ہے

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

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

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

مزید پڑھیں