Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الدوال العامة

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 37 من 57.

تعمل الدالة العامة مع أي نوع. وتمثّل معلمة النوع، المكتوبة بين قوسين زاويين قبل اسم الدالة، النوعَ الذي يستخدمه المستدعي. ويُعدّ T الاسم المعتاد:

fun <T> firstOr(list: List<T>, default: T): T = if (list.isEmpty()) default else list[0]

داخل main:

println(firstOr(listOf(3, 5), 0) + 1)
println(firstOr(listOf<String>(), "none").uppercase())

الناتج:

4
NONE

تستنتج Kotlin وسيطة النوع من الوسائط. عندما لا يوجد شيء يمكن الاستنتاج منه، تكتبها بنفسك، كما في listOf<String>() أعلاه:

fun <T> repeatItem(item: T, times: Int): List<T> = List(times) { item }

داخل main:

println(repeatItem("ab", 3))
println(repeatItem(7, 2))
val empty = repeatItem<Double>(1.5, 0)
println(empty)

الناتج:

[ab, ab, ab]
[7, 7]
[]

يمكن أن تحتوي الدالة على عدة معلمات نوع، ويمكن لمعلمة من نوع دالة أن تستخدمها. هكذا تعمل دوال المكتبة مثل map مع كل نوع من أنواع العناصر والنتائج:

fun <A, B> transform(items: List<A>, f: (A) -> B): List<B> {
    val out = mutableListOf<B>()
    for (item in items) out.add(f(item))
    return out
}

fun <K, V> invert(map: Map<K, V>): Map<V, K> = map.entries.associate { (k, v) -> v to k }

داخل main:

println(transform(listOf("kiwi", "fig")) { it.length })
println(invert(mapOf("a" to 1, "b" to 2)))

الناتج:

[4, 3]
{1=a, 2=b}

يحافظ مُعامِل النوع على نوع المستدعي. تُرجع firstOr(listOf(3, 5), 0) قيمةً من النوع Int، لذا يتم تجميع + 1 بنجاح. كما أن إصدارًا مكتوبًا لـ List<Any> سيقبل أي قائمة أيضًا، لكنه سيُرجع Any ويفرض إجراء تحويل نوع في كل استدعاء:

fun firstAny(list: List<Any>, default: Any): Any = if (list.isEmpty()) default else list[0]
// firstAny(listOf(3, 5), 0) + 1               // خطأ: Any ليس لديه plus
(firstAny(listOf(3, 5), 0) as Int) + 1         // يُجمَّع، لكنه يحتاج إلى cast
firstOr(listOf(3, 5), 0) + 1                   // عام: النتيجة هي Int
challenge icon

التحدي

سهل

اكتب دالتين عامتين تعملان مع قوائم من أي نوع. تُرجع countWhere(items, predicate) عدد العناصر التي تجتاز الدالة الشرطية، وهي دالة من النوع (T) -> Boolean. تُرجع mostCommon(items) العنصر الذي يظهر بأكبر تكرار (العنصر الذي يظهر أولًا في القائمة عند تعادل أعداد التكرار)، أو null لقائمة فارغة.

يقرأ الكود المُ provided سطرًا من الكلمات وسطرًا من الأعداد، ثم يطبع عدد الكلمات التي يزيد طولها عن 3 أحرف، والكلمة الأكثر شيوعًا، وعدد الأعداد الزوجية، والعدد الأكثر شيوعًا، وnothing: null لقائمة فارغة.

ضع الكود الخاص بك في ListTools.kt. يحتوي Main.kt على كود الإدخال/الإخراج المُ provided، ولا يمكن تعديله.

التنسيق المطلوب للإخراج: [المحتوى المترجم هنا]

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    val input = generateSequence(::readLine).toList()
    val words = input[0].split(" ")
    val numbers = input[1].split(" ").map { it.toInt() }
    println("long words: ${countWhere(words) { it.length > 3 }}")
    println("most common word: ${mostCommon(words)}")
    println("even numbers: ${countWhere(numbers) { it % 2 == 0 }}")
    println("most common number: ${mostCommon(numbers)}")
    println("nothing: ${mostCommon(listOf<String>())}")
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin