الدوال العامة
جزء من قسم البرمجة كائنية التوجه في رحلة 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التحدي
سهلاكتب دالتين عامتين تعملان مع قوائم من أي نوع. تُرجع 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>())}")
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin