الفرق بين المراجعتين ل"Kotlin/type aliases"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:التسمية البديلة للأنواع (Type aliases) في لغة Kotlin}}</noinclude> تدعم لغة Kotlin ميّزة التسمية...')
 
ط (تعديل مصطلح متحول)
 
سطر 18: سطر 18:
 
typealias AInner = A.Inner
 
typealias AInner = A.Inner
 
typealias BInner = B.Inner
 
typealias BInner = B.Inner
</syntaxhighlight>إذ لا تٌنشِئ التسمية نوعًا جديدًا بل هي مُجرَّد تسميةٍ لنفس النوع ضمنيًا، فعند كتابة العبارة <code>typealias Predicate<T>‎</code> مثلًا واستخدام <code>Predicate<Int></code>‎ في الشيفرة فإن المُترجِم يُوسِّعها إلى الصيغة ‎<code>(Int) -> Boolean</code> وأصبح ممكنًا بذلك تمريرُ متحولٍ من النوع الذي خصَّصتَه بنفسك حيثما يُستخدَم النوع الأصليّ للدالة والعكس صحيح، مثل:<syntaxhighlight lang="kotlin">
+
</syntaxhighlight>إذ لا تٌنشِئ التسمية نوعًا جديدًا بل هي مُجرَّد تسميةٍ لنفس النوع ضمنيًا، فعند كتابة العبارة <code>typealias Predicate<T>‎</code> مثلًا واستخدام <code>Predicate<Int></code>‎ في الشيفرة فإن المُترجِم يُوسِّعها إلى الصيغة ‎<code>(Int) -> Boolean</code> وأصبح ممكنًا بذلك تمريرُ متغيِّرٍ من النوع الذي خصَّصتَه بنفسك حيثما يُستخدَم النوع الأصليّ للدالة والعكس صحيح، مثل:<syntaxhighlight lang="kotlin">
 
typealias Predicate<T> = (T) -> Boolean
 
typealias Predicate<T> = (T) -> Boolean
  

المراجعة الحالية بتاريخ 18:00، 4 يوليو 2018

تدعم لغة Kotlin ميّزة التسمية البديلة للأنواع الموجودة للبيانات، وخاصّة إن كان اسم النوع طويلًا فيُستعاض عنه باسمٍ أقصرٍ ويُستخدَم الاسم الجديد في كتابة الشيفرات؛ فمن المفيد مثلًا تسمية الأنواع المُعمّمة (generics) بأسماء أقصرٍ، مثل الشيفرة الآتية المُستخدَمة لتسمية أنواع المجموعات (collections):

typealias NodeSet = Set<Network.Node>

typealias FileTable<K> = MutableMap<K, MutableList<File>>

وبالإمكان أيضًا تسمية الأنواع المختلفة للدوال، مثل:

typealias MyHandler = (Int, String, Any) -> Unit

typealias Predicate<T> = (T) -> Boolean

وكذلك الأمر بالنسبة للأصناف الداخليّة (inner classes) والمتداخلة (nested classes)، مثل:

class A {
    inner class Inner
}
class B {
    inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner

إذ لا تٌنشِئ التسمية نوعًا جديدًا بل هي مُجرَّد تسميةٍ لنفس النوع ضمنيًا، فعند كتابة العبارة typealias Predicate<T>‎ مثلًا واستخدام Predicate<Int>‎ في الشيفرة فإن المُترجِم يُوسِّعها إلى الصيغة ‎(Int) -> Boolean وأصبح ممكنًا بذلك تمريرُ متغيِّرٍ من النوع الذي خصَّصتَه بنفسك حيثما يُستخدَم النوع الأصليّ للدالة والعكس صحيح، مثل:

typealias Predicate<T> = (T) -> Boolean

fun foo(p: Predicate<Int>) = p(42)

fun main(args: Array<String>) {
    val f: (Int) -> Boolean = { it > 0 }
    println(foo(f)) // "true" ستظهر

    val p: Predicate<Int> = { it > 0 }
    println(listOf(1, -2).filter(p)) //  "[1]" ستظهر
}

مصادر