دوال الامتداد والدوال عالية الرتبة
أضف سلوكًا إلى الأنواع الموجودة باستخدام دوال الامتداد، واستخدم الدوال عالية الرتبة ودوال النطاق (let وapply وalso وrun وwith) لكتابة شيفرة Kotlin معبّرة.
دوال الامتداد والدوال عالية الرتبة درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
دوال التمديد
تتيح لك دالة التمديد إضافة دوال جديدة إلى الفئات الحالية دون تعديلها أو استخدام الوراثة. ويمكنك تمديد String أو Int أو فئاتك الخاصة، وحتى View في Android.
الصيغة: fun TypeName.functionName() { }
كتابة دوال التمديد
يشير this داخل دالة التمديد إلى الكائن المستقبِل:
fun String.isPalindrome(): Boolean {
val cleaned = this.lowercase().filter { it.isLetter() }
return cleaned == cleaned.reversed()
}
fun Int.isEven() = this % 2 == 0
fun main() {
println("racecar".isPalindrome()) // true
println("hello".isPalindrome()) // false
println(4.isEven()) // true
println(7.isEven()) // false
}دوال تمديد لعناصر Views في Android
نمط شائع في Android — إخفاء عناصر العرض وإظهارها باستخدام دالة تمديد بدلًا من تكرار الشيفرة المتكررة:
import android.view.View
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// Usage in Activity:
// binding.progressBar.show()
// binding.recyclerView.hide()الدوال عالية الرتبة
تأخذ الدالة عالية الرتبة دالةً كمعامل أو تُرجع دالة. لقد استخدمتها من قبل: تُعد filter وmap وforEach جميعًا دوال عالية الرتبة.
صيغة نوع الدالة: (ParamType) -> ReturnType
تمرير الدوال كمعاملات
عرّف دالة تقبل دالةً أخرى:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun main() {
val sum = operate(3, 4) { x, y -> x + y }
val prod = operate(3, 4) { x, y -> x * y }
val max = operate(3, 4, ::maxOf) // method reference
println(sum) // 7
println(prod) // 12
println(max) // 4
}إرجاع الدوال
يمكن للدوال أيضًا إرجاع دوال أخرى — وهذا مفيد لإنشاء سلوك قابل للتهيئة:
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
fun main() {
val double = makeMultiplier(2)
val triple = makeMultiplier(3)
println(double(5)) // 10
println(triple(5)) // 15
val numbers = listOf(1, 2, 3, 4)
println(numbers.map(double)) // [2, 4, 6, 8]
}دوال النطاق: let
تنفّذ دوال النطاق في Kotlin كتلةً على كائن وتُرجع نتيجة. ويُستخدم let للتحقق من القيم الفارغة وإجراء التحويلات:
fun main() {
val name: String? = "Alice"
// Only runs if name is not null
name?.let {
println("Name length: ${it.length}")
println("Upper: ${it.uppercase()}")
}
// Transform a value
val length = name?.let { it.length } ?: 0
println("Length: $length") // 5
}دوال النطاق: apply و also
تُهيّئ apply كائنًا وتُرجع الكائن. أما also فتُجري أثرًا جانبيًا وتُرجع الكائن:
data class Config(var host: String = "", var port: Int = 0, var timeout: Int = 0)
fun main() {
// apply: configure an object (this = receiver)
val config = Config().apply {
host = "api.example.com"
port = 443
timeout = 30
}
println(config) // Config(host=api.example.com, port=443, timeout=30)
// also: log or debug (it = receiver)
val result = listOf(1, 2, 3)
.also { println("Original: $it") }
.map { it * 2 }
.also { println("Doubled: $it") }
}دوال النطاق: run و with
تنفّذ run كتلةً على كائن وتُرجع نتيجة الكتلة. أما with فمشابهة لها، لكنها ليست دالة تمديد:
data class User(val name: String, val age: Int)
fun main() {
val user = User("Bob", 30)
// run: compute something using the object
val greeting = user.run {
if (age >= 18) "Hello, $name!" else "Hi, $name!"
}
println(greeting) // Hello, Bob!
// with: group operations on an object
val info = with(user) {
"Name: $name, Age: $age"
}
println(info) // Name: Bob, Age: 30
}مرجع سريع لدوال النطاق
مرجع سريع لاختيار دالة النطاق المناسبة:
let— كتلة آمنة مع القيم الفارغة، وتحويل الكائن، وإرجاع نتيجة lambdaapply— تهيئة الكائن، وإرجاع الكائن (this)also— الآثار الجانبية (مثل التسجيل)، وإرجاع الكائن (it)run— حساب نتيجة من الكائن، وإرجاع نتيجة lambdawith— تجميع الاستدعاءات على كائن، وليست دالة تمديد
الدوال inline و reified
ضع علامة inline على الدالة عالية الرتبة لتجنب تخصيص كائن lambda وقت التشغيل. تتيح لك reified استخدام النوع العام T وقت التشغيل (إذ يُمحى عادةً):
inline fun <reified T> Any.isOfType(): Boolean = this is T
fun main() {
println("hello".isOfType<String>()) // true
println(42.isOfType<String>()) // false
println(3.14.isOfType<Double>()) // true
}تحقق سريع
أي دالة نطاق هي الأنسب لتهيئة كائن أُنشئ حديثًا وإرجاع الكائن نفسه؟
مراجعة: دوال التمديد والدوال عالية الرتبة
أصبحت الآن تمتلك مجموعة أدوات Kotlin الوظيفية:
- دوال التمديد — إضافة سلوك إلى أي نوع دون وراثة
- الدوال عالية الرتبة — تمرير الدوال وإرجاعها لإنشاء واجهات برمجية مرنة
- دوال النطاق:
let(التحقق من القيم الفارغة)، وapply(التهيئة)، وalso(أثر جانبي)، وrun/with(الحساب) inline+reified— lambdas دون تكلفة إضافية مع معلومات النوع وقت التشغيل
التالي: إنشاء تطبيقات متعددة الشاشات باستخدام Fragments.
الأسئلة الشائعة
هل درس «دوال الامتداد والدوال عالية الرتبة» مجاني؟
نعم — نص درس «دوال الامتداد والدوال عالية الرتبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «دوال الامتداد والدوال عالية الرتبة»؟
أضف سلوكًا إلى الأنواع الموجودة باستخدام دوال الامتداد، واستخدم الدوال عالية الرتبة ودوال النطاق (let وapply وalso وrun وwith) لكتابة شيفرة Kotlin معبّرة. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «دوال الامتداد والدوال عالية الرتبة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أمان القيم الفارغة
- الفئات والكائنات
- فئات البيانات والفئات المحصورة
- دوال الامتداد والدوال عالية الرتبة