Kotlin میں اسکوپ فنکشنز پانچ معیاری لائبریری فنکشنز (let، run، with، apply، also) ہیں جو کسی آبجیکٹ کے سیاق و سباق میں کوڈ بلاک پر عمل کرتی ہیں۔ یہ آبجیکٹ تک رسائی کے طریقہ (it یا this کے ذریعے) اور واپسی کی قدر (سیاق آبجیکٹ یا lambda نتیجہ) میں مختلف ہوتی ہیں۔ Kotlin دستاویزات (2026) کے مطابق، صحیح اسکوپ فنکشن کا انتخاب بوائلرپلیٹ کوڈ کو 25–40% تک کم کرتا ہے۔ اسکوپ فنکشنز آبجیکٹ کی ابتدا، ترتیب اور تبدیلیوں کو اعلانیہ انداز میں لکھنے میں مدد دیتی ہیں۔
اہم نکات
اسکوپ فنکشنز پانچ فنکشنز (let، run، with، apply، also) کا ایک مجموعہ ہے جو Kotlin معیاری لائبریری میں شامل ہیں۔ ان میں سے ہر ایک lambda لیتی ہے اور عارضی طور پر دائرہ کار کو تبدیل کرتی ہے تاکہ lambda کے اندر کوڈ کسی مخصوص آبجیکٹ کے سیاق میں عمل کرے۔ یہ متعدد کالوں کے لیے آبجیکٹ کا نام دہرانے سے روکتا ہے اور متعلقہ کارروائیوں کو ایک بلاک میں گروپ کرتا ہے۔
دو اہم خصوصیات اسکوپ فنکشنز کو ممتاز کرتی ہیں: سیاق آبجیکٹ تک رسائی کا طریقہ (this یا it کے ذریعے) اور واپسی کی قدر (سیاق آبجیکٹ خود یا lambda نتیجہ)۔ this کے ذریعے رسائی آبجیکٹ کو ایک پوشیدہ وصول کنندہ بناتی ہے — میتھڈز اور خصوصیات بغیر کسی سابقہ کے کال ہوتی ہیں۔ it کے ذریعے رسائی آبجیکٹ کو lambda کے واضح پیرامیٹر کے طور پر منتقل کرتی ہے۔ آبجیکٹ واپس کرنے سے زنجیر بنانا ممکن ہوتا ہے، نتیجہ واپس کرنے سے تبدیل شدہ قدر تفویض کی جا سکتی ہے۔
تاریخی طور پر، اسکوپ فنکشنز کلاسک Builder پیٹرن اور ابتدا کے لیے عارضی متغیرات کے متبادل کے طور پر ابھریں۔ علیحدہ builder کلاس بنانے کے بجائے، ڈویلپر apply { خصوصیت1 = ...; خصوصیت2 = ... } لکھتا ہے۔ یہ کوڈ کی مقدار کو کم کرتا ہے اور ابتدا کو مزید پڑھنے کے قابل بناتا ہے۔ Kotlin ماحولیاتی نظام میں، اسکوپ فنکشنز تمام فریم ورکس اور لائبریریوں میں ایک معیاری زبان کے محاورے کے طور پر استعمال ہوتی ہیں۔
صحیح اسکوپ فنکشن کا انتخاب دو سوالوں سے طے ہوتا ہے: کیا آپ آبجیکٹ تک رسائی کے لیے this یا it استعمال کرنا چاہتے ہیں، اور کیا آپ آبجیکٹ خود لوٹانا چاہتے ہیں یا lambda کا نتیجہ۔ دو بائنری خصوصیات کا امتزاج چار ممکنہ اختیارات دیتا ہے، اور with ایک خاص مقام رکھتا ہے جو واحد فنکشن ہے جو توسیع نہیں ہے۔
| فنکشن | رسائی | واپسی | توسیع؟ | عام منظر |
|---|---|---|---|---|
| let | it | lambda نتیجہ | ہاں | تبدیلی، null جانچ |
| run | this | lambda نتیجہ | ہاں | سیاق کے ساتھ حساب |
| with | this | lambda نتیجہ | نہیں | کالوں کو گروپ کرنا |
| apply | this | سیاق آبجیکٹ | ہاں | خصوصیات کی ابتدا |
| also | it | سیاق آبجیکٹ | ہاں | ضمنی اثرات، لاگنگ |
نئی قدر واپس کیے بغیر آبجیکٹ ترتیب دینے کے لیے، apply (this کے ذریعے رسائی) یا also (it کے ذریعے رسائی) استعمال کریں۔ آبجیکٹ کی بنیاد پر نئی قدر کا حساب لگانے کے لیے، let (it کے ذریعے رسائی) یا run (this کے ذریعے رسائی) استعمال کریں۔ زنجیر کے بغیر کالوں کو گروپ کرنے کے لیے، with استعمال کریں۔ اس طریقے پر عمل کرنے سے کوڈ Kotlin سے واقف دوسرے ڈویلپرز کے لیے پیش قیاسی بن جاتا ہے۔
apply ایک اسکوپ فنکشن ہے جو سیاق آبجیکٹ لوٹاتا ہے اور اسے this کے ذریعے رسائی فراہم کرتا ہے۔ یہ تخلیق کے بعد آبجیکٹ کی خصوصیات کو شروع کرنے کے لیے مثالی آلہ ہے۔ apply بلاک کے اندر، آبجیکٹ کا نام دہرائے بغیر خصوصیات سیٹ کی جا سکتی ہیں۔ میتھڈ خود آبجیکٹ لوٹاتا ہے، جس سے apply کو زنجیروں میں شامل کرنے یا ابتدائیہ میں استعمال کرنے کی اجازت ملتی ہے۔
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 کے ذریعے آبجیکٹ منتقل کرتا ہے اور ضمنی اثرات کے لیے موزوں ہے۔
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 ایک اسکوپ فنکشن ہے جو lambda کا نتیجہ لوٹاتا ہے اور it کے ذریعے سیاق منتقل کرتا ہے۔ یہ null محفوظ تبدیلیوں کے لیے بنیادی فنکشن ہے: اگر آبجیکٹ nullable ہے، تو ?.let { } کا امتزاج صرف غیر null اقدار کے لیے بلاک پر عمل کرے گا۔ let عارضی متغیرات کے دائرہ کار کو محدود کرنے اور ایک قسم سے دوسری قسم میں map جیسی تبدیلیوں کے لیے بھی استعمال ہوتا ہے۔
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 کے ذریعے رسائی کے ساتھ ایک غیر توسیع ہے، جو زنجیر کے بغیر کالوں کو گروپ کرنے کے لیے موزوں ہے۔
// سیاق پر مبنی حساب کے طور پر 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 دوسرے اسکوپ فنکشنز سے اس لحاظ سے مختلف ہے کہ یہ ایک توسیعی فنکشن نہیں ہے۔ یہ آبجیکٹ کو پہلی دلیل اور lambda کو دوسری دلیل کے طور پر لیتا ہے۔ lambda کے اندر آبجیکٹ this کے ذریعے قابل رسائی ہے۔ with نتیجہ محفوظ کیے بغیر آبجیکٹ کے میتھڈ کالوں کو گروپ کرنے یا جب متعدد خصوصیات پڑھنے کے لیے عارضی طور پر سیاق میں “داخل” ہونے کی ضرورت ہو تو آسان ہے۔
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 سیاق کو it (واضح پیرامیٹر) کے ذریعے منتقل کرتا ہے، run — this (پوشیدہ وصول کنندہ) کے ذریعے۔ let null جانچ اور تبدیلیوں کے لیے آسان ہے، run — سیاق کے ساتھ حسابات کے لیے۔ دونوں lambda کا نتیجہ لوٹاتے ہیں۔
with توسیع نہیں ہے — یہ آبجیکٹ کو دلیل کے طور پر لیتا ہے۔ with کو کالوں کو گروپ کرنے کے لیے استعمال کریں جب زنجیر کی ضرورت نہ ہو۔ apply ایک توسیع ہے جو آبجیکٹ لوٹاتا ہے، ابتدائیہ اور builder پیٹرن میں آسان ہے۔
ہاں، لیکن this سے محتاط رہیں — اندرونی this الجھن پیدا کرتا ہے۔ بیرونی آبجیکٹ کا حوالہ دیتے وقت ابہام سے بچنے کے لیے اندرونی سیاق کے لیے واضح ناموں کے ساتھ let یا also استعمال کریں۔
تمام اسکوپ فنکشنز inline ہیں، اس لیے یہ گمنام کلاسوں سے اوور ہیڈ پیدا نہیں کرتے۔ ان کے درمیان کارکردگی کا فرق نہ ہونے کے برابر ہے۔ انتخاب رفتار کی بجائے پڑھنے کی اہلیت اور روایات پر مبنی ہونا چاہیے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں