نتائج البحث
اذهب إلى التنقل
اذهب إلى البحث
التهيئة الأولية
class في JavaScript
التصريح عن الصنف (class declaration) يؤدي إلى إنشاء صنف جديد له اسمٌ معيّن يستخدم الوراثة عبر سلسلة prototype. يمكنك أيضًا تعريف الأصناف عبر تعابير تعريف الأصناف (class expression)، لكن التصريح عن الصنف بهذه الطريقة يختلف عن استخدام تعابير تعريف الأصناف في أنَّه لا يسمح بإعادة التصريح عن الصنف مرةً أخرى، وسيرمي (throw) خطأً إن حاولنا ذلك. البنية العامة class name [extends] {
// محتويات الصنف
}
الوصف كما في تعابير تعريف الأصناف، ستُنفَّذ التعابر البرمجية الموجودة ضمن الصنف في نمط ...
أصناف البيانات (Data Classes) في لغة Kotlin
تُنشَأ بعض الأصناف بهدف تخزين البيانات فيها بشكلٍ أساسيّ، وبالتالي فإنّ كلّ ما تقوم به هذه الأصناف من وظائف يرتبط بالبيانات، وهذا ما يُسمى بأصناف البيانات في لغة Kotlin وتُعرَّف بالمُحدِّد data كما يلي: data class User(val name: String, val age: Int)
قواعد عامّة يقوم المُترجِم في الأصناف من هذه النوع باشتقاق العناصر (deriving members) الآتية من كلِّ الخاصّيّات المُعرَّفة في الباني الأساسيّ (primary constructor): كلًا من equals() و hashCode() الدالة toString() بشكلها "User(name=John, age=42)" الدوال بالصيغة componentN() functions بما ...
الأصناف (Classes) والوراثة (Inheritance) في لغة Kotlin
تُستخدم الكلمة المفتاحيّة class للتصريح (declaration) عن الصنف بالصيغة الآتية (اسم الصنف Invoice): class Invoice {
}
ويحتوي التصريح على اسم الصنف (class name) وترويسة الصنف (class header) (والتي تُحدِّد معاملات النوع والباني الأساسيّ ...إلخ.) وبُنية الصنف (class body) محاطةً بالقوسين {}، وإن كلًا من ترويسة الصنف وبُنيته اختياريتان؛ فإذا كان الصنف خاليًا لا حاجة للأقواس، مثل: class Empty
الباني (Constructor) يوجد لكلّ صنف في لغة Kotlin بانٍ رئيسيّ (primary) واحدٌ وبانٍ -أو أكثر- ثانويّ (secondary)، إذ يُعدُّ الباني الرئيسيّ جزءًا من ...
الأصناف المُغلَقة (Sealed Classes) في لغة Kotlin
تُستخدَم الأصناف المُغلَقة لتمثيل الهرميّة (hierarchy) المحدودة للأصناف؛ وذلك عندما يكون نوع القيمة هو أحد الأنواع الموجودة في مجموعةٍ مُحدَّدةٍ (limited set) وليس أيّ نوع آخر، وبالتالي تُعدُّ هذه الأصناف إضافةً (extension) لأصناف الثوابت المُتعدَّدة (enum classes)، إذ إنّ مجموعة القيم لنوع enum محدودة أيضًا ولكل ثابت فيها نسخةٌ (instance) واحدةٌ فقط، بينما يمكن أن يكون للصنف الفرعيّ (subclass) من الصنف المغلق أكثر من نسخةٍ تحتوي على الحالة (case). ويُستخدَم المُحدِّد (modifier) sealed قبل اسم الصنف للتصريح عن أنّه من ...
الصنف Class في روبي
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف Class. عادةً، يمكن عادةً إنشاء صنف جديد بالشكل التالي: class Name
# تكتب هنا الشيفرة التي تعرف سلوك الصنف
end
عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع Class ويسند إلى ثابت عام (global constant، هو Name في المثال السابق). عند استدعاء Name.new لإنشاء كائن جديد، يُنفَّذ التابع new الخاص بالصنف Class بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع new: class Class
alias old_new ...
أصناف الثوابت المُتعدِّدة (Enum Classes) في لغة Kotlin
يتلخَّصُ الاستخدام الرئيسيّ لأصناف الثوابت المتعدَّدة في قدرتها على تعريف الاستخدام (implementing) للثوابت المتعدًّدة الحافظة للنوع (type-safe)، ويُصرَّح عنها بالشكل: enum class Direction {
NORTH, SOUTH, WEST, EAST
}
إذ يُعدُّ كلُّ ثابتٍ فيها كائنًا (object)، ويُفصل فيما بينها بالفاصلة , . التهيئة (Initialization) لمّا كان كلّ ثابتٍ في صنف الثوابت المتعدِّدة (enum) يُعدُّ كائنًا فيمكن إجراء التهيئة كما يلي: enum class Color(val rgb: Int) {
RED(0xFF0000),
...
الأصناف الخاملة (Lazy Classes)
توصيف المشكلة وجود بعض الأصناف (classes) قليلة الاستخدام ولا أهمية لها في البرنامج، ويجدر التخلُّص منها إذ إنّ فهم وصيانة الأصناف يكلِّفان الوقت والجهد. أسبابها يكون تصميم الصنف بدايةً لأداء مهامٍ (functionality) معيّنة، ولكنّه قد يصبح صغيرًا لا أهميّة له من بعد الكثير من عمليات إعادة التصميم (refactoring). قد تُخصَّص بعض الأصناف لدعم التطوير المستقبلي للبرنامج (كالتخطيط المُسبق لميّزاتٍ ستُضاف لاحقًا)، وتصبح تلك الأصناف خاملةً عندما لا يحدث أيُّ تطويرٍ فيما بعد. وما الحل؟ تضمين الأصناف (inline classes) للعناصر (components) ...
أصناف البيانات (Data Classes)
توصيف المشكلة وجود العديد من أصناف البيانات في الشيفرة، والتي تُستخدَم لتخزين البيانات التي تحتاج إليها الأصناف الأخرى، إذ تحتوي على حقولٍ للبيانات (fields) وتوابع للوصول إليها (accessors) أي توابعَ للحصول على بيانات الحقول (getter) وأخرى لتعديلها (setter)، ولا تقوم هذه الأصناف بأيّ مهمّة أخرى ولا تستطيع كذلك تنفيذ العمليات (operations) على بياناتها بمفردها. أسبابها من الطبيعي أن يحتوي الصنف -بادئ الأمر- على القليل من الحقول العامّة (public fields) وبعض التوابع للوصول إليها (accessors) ولكن إن استمرَّ الصنف كذلك فلن ...
دمج الصنف (Inline Class)
المشكلة وجود صنفٍ (class) لا يقوم بأيّ مهمّة فعليّة ولا يُخطَّط لإضافة مهامٍ إليه لاحقًا. الحل نقل كافّة الميّزات (features) من هذا الصنف إلى صنفٍ آخر. مثال قبل إعادة التصميم يحتوي الصنف Person على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber ولاشيء آخر، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber، كما هو موضَّحٌ في مخطط الأصناف الآتي: الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على ...
استخراج الصنف (Extract Class)
المشكلة وجود صنفٍ (class) واحدٍ يقوم بمهامٍ عديدةٍ يمكن توزيعها على صنفين. الحل إنشاء صنفٍ جديدٍ ونقل بعض الحقول (fields) والتوابع (methods) إليه، والتي تتعلَّق بالمهام الوظيفيّة (functionality) لهذا الصنف الجديد. مثال قبل إعادة التصميم يحتوي الصنف Person على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber، كما في مخطط الأصناف الآتي: الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا ...
CSS/Topics/Pseudo Classes
الصنف التمثيل :active العناصر (مثل الأزرار) التي جرى تفعيلها من المستخدم. وعند استخدام الفأرة سيبدأ «تفعيل» العنصر عندما يضغط المستخدم على الزر الرئيسي لها وينتهي عند إفلات الضغط على ذاك الزر. :checked أزرار انتقاء (radio button) أو صناديق تأشير (checkbox) أو خيارات <option> في عنصر<select> تم تحديدها أو انتقاؤها. يمكن أن يُفعِّل المستخدم هذه الحالة بتفعيل أو انتقاء العنصر. :default أي عنصر مُختار افتراضيًا بين مجموعة من العناصر المتعلقة به؛ ويمكن استخدام هذا الصنف الزائف على أيّة أزرار عادية <button> أو أزرار انتقاء (radio button) ...
الأصناف الواسعة (Large Classes)
توصيف المشكلة احتواء الصنف (class) العديدَ من الحقول (fields) والتوابع (methods) وشيفرةً بأسطرَ كثيرةٍ. أسبابها تبدأ الأصناف صغيرةً ليزداد حجمها مع استمرار تطوُّر البرنامج (كما الحال بالتوابع الطويلة) لأنَّ المبرمج يرى أنَّ إضافة ميِّزاتٍ (features) جديدةٍ في صنفٍ موجودٍ مسبقًا أكثر سهولةً من إنشاء أصنافٍ جديدةٍ مخصَّصةٍ لها. وما الحل؟ الحل بسيطٌ جدًا؛ وهو تقسيم الصنف، وذلك بإحدى الوسائل الآتية: إنشاء صنفٍ جديدٍ (Extract Class) إن كان من الممكن فصلُ بعض مهامّ الصنف الحاليّ ونقلها للصنف الجديد. إنشاء صنفٍ فرعيٍّ ...
محدد الأصناف ".class" في jQuery
محدد الأصناف الوصف يُستخدَم مُحدِّد الأصناف في تحديد كافّة العناصر التي تمتلك الصّنف المُعطَى. jQuery( ".class" ) أضيفت في الإصدار: 1.0. class الصّنف المطلوب البحث عنه. يُمكِن للعنصر أن يمتلك عدّة أصناف، يجب أن يتطابق واحد منها فقط مع هذه القيمة. تستخدم jQuery لأجل مُحدِّدات الأصناف الدالة getElementsByClassName() الأصليّة في JavaScript إن كان المتصفّح يدعمها. أمثلة إيجاد العنصر الذي يمتلك الصّنف myClass: <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>class مثال عن المحدد</title>
<style>
div, span {
...
التابع new في الصنف Class في روبي
يستدعي التابع new التابعَ allocate لإنشاء كائن جديد من الصنف class، ثم يستدعي التابع initialize مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة. هذا هو التابع الذي يُستدعى كلما أريد إنشاء كائن باستخدام التابع .new. البنية العامة new(args, ...) → obj
المعاملات args الوسيط المراد تمريره إلى التابع initialize عند استدعائه. ... الوسائط الأخرى المراد تمريرها إلى التابع initialize عند استدعائه. القيم المعادة يعاد الكائن الذي أنشئ. انظر أيضًا التابع allocate: يحجز مساحةً من الذاكرة لكائن جديد من الصنف class ...
التابع superclass في الصنف Class في روبي
يعيد التابع superclass الصنف الأب (superclass) للصنف المستدعى معه. البنية العامة superclass → a_super_class or nil
القيمة المعادة يعاد الصنف الأب للصنف المعطى أو القيمة nil إن لم يكن للصنف المعطى صنف أب. أمثلة مثال على استخدام التابع superclass: File.superclass #=> IO
IO.superclass #=> Object
Object.superclass #=> BasicObject
class Foo; end
class Bar < Foo; end
Bar.superclass ...
التابع allocate في الصنف Class في روبي
يحجز التابع allocate مساحةً من الذاكرة لكائن جديد من الصنف class دون استدعاء التابع initialize مع النسخة (instance) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف class. البنية العامة allocate() → obj
القيم المعادة يعاد كائن من الصنف class. أمثلة مثال على استخدام التابع allocate: klass = Class.new do
def initialize(*args)
@initialized = true
end
def initialized?
@initialized || false
end
end
klass.allocate.initialized? #=> false
انظر أيضًا التابع new: يُنشئ صنفًا جديدًا مجهولًا غير مسمى (unnamed) من ...
التابع inherited في الصنف Class في روبي
يُستدعَى التابع inherited كرد نداء في كل مرة يُنشأ فيها صنف فرعي (subclass) من الصنف الحالي. البنية العامة inherited(subclass)
أمثلة مثال على استخدام التابع inherited: class Foo
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
end
class Bar < Foo
end
class Baz < Bar
end
انظر أيضًا التابع new: يُنشئ صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب (superclass) الممرر إليه (أو من الصنف Object إن لم يمرر إليه أي شيء). التابع allocate: يحجز مساحةً من الذاكرة لكائن جديد من الصنف class ...
التابع new في الصنف Class في روبي
يُنشئ التابع new صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب ( superclass) المُمرَّر إليه (أو من الصنف Object إن لم يمرر إليه أي شيء). يمكن إعطاء صنف ما اسمًا عن طريق تعيين كائن الصنف (class object) وإعطائه قيمة ثابتة. إن أعطيت كتلة برمجية، فسيُمرَّر إليها كائن الصنف (class object)، وستقدَّر الكتلة في سياق ذلك الصنف كما هو الحال مع class_eval. عيِّن الصنف وأعطه قيمة ثابتة (يبدأ الاسم بأحرف كبيرة) إذا كنت تريد معاملته كصنف اعتيادي. البنية العامة new(super_class=Object) ...
Kotlin/Topics
بُنية لغة Kotlin مشابهةٌ لبنية لغة البرمجة Java بوصفها كائنيّة التوجه (OOP)، وبالتالي فهي تعتمد أساسًا على وجود الأصناف (classes) التي تحتوي بدورها على الخاصّيّات (properties) والدوال (functions)، كما وتدعم Kotlin العلاقات فيما بينها مثل الوراثة (inheritance) من صنفٍ أعلى (superclass) أو التداخل فيما بينها (nesting classes)، وتمتاز بوجود مُحدِّدات الوصول (visibility modifiers) للتحكم بعمليات الوصول للبيانات المُخزَّنة، وكذلك فهي تعتمد في بُنيتها على الحزم (packages) والمكتبات (libraries) التي تحتوي على الدوال المساعدة عند الحاجة إليها، أمّا عن بُنية التعليمات ...
الخاصية javaClass في Kotlin
تعيد الخاصيّة javaClass صنف Java الخاص بالكائن (object) الذي تُستدعى عبره أثناء التشغيل (runtime)، وتُعرَّف هذه الخاصية في جميع الأصناف الفرعيّة (sub-classes) من الصنف Any. البنية العامة inline val <T : Any> T.javaClass: Class<T>
يُلاحَظ وجود الكلمة المفتاحية inline للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع توثيق الدوال المباشرة (inline functions). القيم المعادة صنف Java الخاصّ بالكائن الذي تُستدعى عبره أثناء التشغيل (runtime). أمثلة تنشِئ الشيفرة الآتية سلسلةً نصيةً باسم a، وتحصل على صنف Java الخاص بها عبر استدعاء ...
الخاصية javaClass في Kotlin
تعيد الخاصيّة javaClass صنف Java الخاص بالكائن (object) الذي تُستدعى عبره أثناء التشغيل (runtime)، وتُعرَّف هذه الخاصية في جميع الأصناف الفرعيّة (sub-classes) من الصنف Any. البنية العامة inline val <T : Any> T.javaClass: Class<T>
يُلاحَظ وجود الكلمة المفتاحية inline للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع توثيق الدوال المباشرة (inline functions). القيم المعادة صنف Java الخاصّ بالكائن الذي تُستدعى عبره أثناء التشغيل (runtime). أمثلة تنشِئ الشيفرة الآتية سلسلةً نصيةً باسم a، وتحصل على صنف Java الخاص بها عبر استدعاء ...
التوصيفات (Annotations) في لغة Kotlin
التصريح عن التوصيف (Annotation Declaration) تُعدُّ التوصيفات إحدى الوسائل لإضافة بياناتٍ توصيفيّةٍ (metadata) إلى الشيفرة، وللتصريح عن التوصيف يُضاف المُحدِّد annotation قبل اسم الصنف، مثل: annotation class Fancy
وقد تُحدَّد بعض خواصّ التوصيفات (annotation attributes) باستخدام التوصيفات الآتية (meta-annotations) لتوصيفات الصنف: @Target لتحديد نوع العناصر التي يمكن توصيفها مثل الأصناف (classes) والدوال (functions) والخاصّيّات (properties) والتعابير (expressions) و... إلخ. @Retention لتحديد فيما إن كان التوصيف مُخزَّنًا في ملفات الأصناف المُترجَمة، أو مرئيًا عبر انعكاسٍ (reflection) أثناء التنفيذ (runtime) (وكلاهما محقُّق بالحالة ...
أصناف المكتبة غير الكافية (Incomplete Library Classes)
توصيف المشكلة لا تلبِّي أصناف المكتبة (library classes) كافّة احتياجات البرنامج مع استمرار تطوُّره، ولا يمكن تعديلها لأنّها مُخصَّصةٌ للقراءة فقط (read-only). أسبابها عدم تزويد مُطوِّر المكتبة كافَّةَ الميّزات (features) التي تحتاجها في البرنامج أو امتناعه عن تعريفَ استخدامها (implement). وما الحل؟ لتعريف بعض التوابع (methods) في المكتبة عليك بتعريف التوابع الدخيلة (introduce foreign methods). أمّا لإجراء تغييراتٍ واسعةٍ في صنف المكتبة فعليك بتعريف الإضافات المحليّة (introduce local extensions). إليك المزيد سيكون حلُّ المشكلة كفيلًا بالتقليل من تكرار الشيفرات (duplications)، ...
الصنف Enum في Kotlin
يعدُّ الصنف Enum الصنف الأساس لكل الأصناف القابلة للعد (enum classes). إن أردت الاطلاع على معلومات أوسع حول هذه الأصناف، فاقرأ هذا المرجع. abstract class Enum<E : Enum<E>> : Comparable<E> (source)
الدوال البانية (Constructors) <init> يعدُّ الصنف Enum الصنف الأساس لكل أصناف الترقيم (enum classes). الخاصيات name تمثل اسم الثابت المعرف في الكائن enum الذي استُدعي معها كما سُمّي أُثناء تعريف هذا الكائن. ordinal تمثل ترتيب (ordinal) الثابت المعرف في الكائن enum الذي استُدعي معها. الدوال clone ترمي هذه الدالة استثناءً لأنّ ثوابت الصنف Enum لا يمكن أن ...
الصنف Enum في Kotlin
يعدُّ الصنف Enum الصنف الأساس لكل الأصناف القابلة للعد (enum classes). إن أردت الاطلاع على معلومات أوسع حول هذه الأصناف، فاقرأ هذا المرجع. abstract class Enum<E : Enum<E>> : Comparable<E> (source)
الدوال البانية (Constructors) <init> يعدُّ الصنف Enum الصنف الأساس لكل أصناف الترقيم (enum classes). الخاصيات name تمثل اسم الثابت المعرف في الكائن enum الذي استُدعي معها كما سُمّي أُثناء تعريف هذا الكائن. ordinal تمثل ترتيب (ordinal) الثابت المعرف في الكائن enum الذي استُدعي معها. الدوال clone ترمي هذه الدالة استثناءً لأنّ ثوابت الصنف Enum لا يمكن أن ...
المُنشِئ الحافظ للنوع (Type-Safe Builder) في لغة Kotlin
المُنشِئ الحافظ للنوع (Type-Safe Builder) يُتاح بناءُ المُنشِئ الستاتيكيّ الحافظ للنوع في لغة Kotlin باستخدام الدوال ذات التسمية المعبِّرة كمُنشِئ (builder) بالإضافة إلى قيم حرفية (literals) للدوال مع المستقبِل (receiver)، إذ يسمح المُنشِئ الحافظ للنوع ببناء لغات مُخصَّصة المجال (DSL) بالاعتماد على Kotlin بما يتناسب مع إنشاء بُنى البيانات الهرميّة المعقَّدة بطريقةٍ نصف تصريحية (semi-declarative)، وهذه بعض الأمثلة من حالات استخدامه: توليد ترميزٍ (markup) باستخدام شيفرة Kotlin مثل HTML أو XML تصميم أجزاء واجهات المستخدم (UI) برمجيًا مثل Anko ضبط ...
الإضافات (Extensions) في لغة Kotlin
الإضافات (Extensions) توفِّر لغة Kotlin -كما هو الحال في لغات البرمجة مثل C# و Gosu- إمكانيّة الإضافة على الأصناف (classes) بوظائف جديدةٍ دون اللجوء إلى الوراثة (inheritance) منها أو استخدام أيّ أنماطٍ تصميميّةٍ مثل Secorator، وذلك من خلال تصريحات خاصّة تُدعى الإضافات (extensions)، إذ تدعم لغة Kotlin الدوال الإضافيّة (extension functions) والخاصّيّات الإضافيّة (extension properties). الدوال الإضافيّة (Extension Functions) لتعريف دالةٍ إضافيّةٍ يجب أن يُسبَق اسمها بنوع المستقبِل (receiver type) أي النوع الذي ستتمّ الإضافة عليه، ففي الشيفرة الآتية تُضاف ...
المقارنة بين لغتيّ البرمجة Java و Kotlin
بعض المواضيع في Java ومعالجتها في Kotlin عالجت لغة Kotlin العديد من المشاكل الموجودة في Java وهي: التحكُّم بالمرجعيّات الفارغة (null references) عبر نظام الأنواع لا وجود للأنواع الخامّ (raw types) تُعدُّ المصفوفات في Kotlin ثابتة (invariant) للدوال (functions) في Kotlin أنواع مناسبة وهذا ما يتعارض مع التحويلات SAM في Java التنوّع في موقع الاستخدام (use-site variance) دون الحاجة إلى المحارف البديلة (wildcards) لا وجود للاستثناءات المُتحقَّق منها (checked exceptions) في Kotlin ما تمتاز به Java ولا تدعمه Kotlin الاستثناءات ...
الدالة filterIsInstance() في Kotlin
تعيد الدالة filterIsInstance() قائمة تحوي عناصر المصفوفة أو المجموعة المعطاة التي هي نسخةٌ (instance) من نوع أو صنفٍ معيّن. البنية العامة inline fun <reified R> Array<*>.filterIsInstance(): List<R>
inline fun <reified R> Iterable<*>.filterIsInstance(): List<R>
يمكن تمرير المعامل klass إلى الدالة filterIsInstance(): fun <R> Array<*>.filterIsInstance(klass: Class<R>): List<R>
fun <R> Iterable<*>.filterIsInstance(klass: Class<R>): List<R>
بيئة التشغيل المطلوبة: JVM وجود الكلمة المفتاحية inline يدل على أنَّ هذه الدالة مباشرة (لمزيد من التفاصيل، راجع توثيق الدوال المباشرة)، واستخدام الكلمة المفتاحية reified يسمح بالوصول إلى نوعٍ مُمرَّر كمتحولٍ وسيطٍ (parameter، راجع توثيق reified ...
الانعكاس (Reflection) في لغة Kotlin
الانعكاس هو مجموعةٌ من مميّزات اللغة والمكتبات التي تسمح بمراقبة بُنية البرنامج أثناء التنفيذ، إذ تولي لغة Kotlin أهميةً كبرى لكلٍّ من الدوال (functions) والخاصّيّات (properties) وتستمر بتتبُّعها (مثل معرفة اسم أو نوع الخاصّيّة والدالة أثناء التنفيذ) وهذا يرتبط ارتباطًا وثيقًا مع استخدام النمط الوظائفيّ (functional) أو التفاعليّ (reactive). ملاحظة: إن الجزء التنفيذيّ (runtime component) المطلوب في منصّة العمل Java لاستخدام ميزات الانعكاس يُوزَّع كملف .jar مستقلٍّ (kotlin-reflect.jar) وذلك بهدف تخفيض حجم التخزين المطلوب لمكتبة التنفيذ (runtime library) للتطبيقات غير ...
الحزم (Packages) في Kotlin
التصريح عن الحزم يبدأ الملف المصدريّ (source file) عادةً بالتصريح (declaration) عن الحزم مثل: package foo.bar
fun baz() {}
class Goo {}
// ...
ويتوضع حينها كلُّ ما يحتويه هذا الملف (كالأصناف [classes] والدوال [functions] مثلًا) في الحزمة المُصرَّح عنها ببدايته، ففي الشيفرة السابقة إن الاسم الفعليّ الكامل للدالة baz() هو foo.bar.baz والاسم الكامل للصنف Goo هو foo.bar.Goo. وإذا لم تُحدَّد الحزمة في بداية الملف فإن محتوياته تتبع للحزمة الافتراضيّة "default" التي لا اسم لها. استيراد الحزم الافتراضيّة (Default Imports) يُستورَد عددٌ من الحزم ...
الدالة Enum.equals() في Kotlin
تتحقق الدالة equals() إذا ما كان الكائن المُمرّر إليها يساوي الكائن الذي استدعي معها. استدعاء هذه الدالة يجب أن يكون: انعكاسيًا (Reflexive): لكل مرجع x لا يساوي null، يجب أن يعيد استدعاء x.equals(x) القيمة true. تماثليًَا (Symmetric): لكل قيمتين مرجعيتين x و y لا تساويان null، سيعيد الاستدعاء x.equals(y) القيمة true إذا، وفقط، إذا أعادت y.equals(x) القيمة true. تواتريًا (Transitive): لكل القيم المرجعية x و y و z التي لا تساوي null، سيعيد استدعاء x.equals(z) القيمة true إن أعادت x.equals(y) و ...
التسمية البديلة للأنواع (Type aliases) في لغة Kotlin
تدعم لغة 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 ...
الدالة filterIsInstanceTo() في Kotlin
تضيف الدالة filterIsInstanceTo() عناصر المصفوفة أو المجموعة المعطاة التي هي نسخةٌ (instance) من نوع أو صنفٍ معيّن إلى المجموعة المتغيرة destination المُمرّرة إليها. البنية العامة inline fun <reified R, C : MutableCollection<in R>> Array<*>.filterIsInstanceTo(
destination: C
): C
inline fun <reified R, C : MutableCollection<in R>> Iterable<*>.filterIsInstanceTo(
destination: C
): C
يمكن تمرير معامل klass إلى الدالة filterIsInstanceTo(): fun <C : MutableCollection<in R>, R> Array<*>.filterIsInstanceTo(
destination: C,
klass: Class<R>
): C
fun ...
الصنف MatchGroup في Kotlin
يمثل الصنف MatchGroup النتائج التي نحصل عليها من مجموعة واحدة ضمن MatchResult الخاصة بالصنف Regex. data actual class MatchGroup
الدوال البانية <init> تنشئ كائنًا من النوع MatchGroup الذي يمثل النتائج التي نحصل عليها من مجموعة واحدة ضمن MatchResult الخاصة بالصنف Regex. الخاصيات range تمثل مجال الفهارس التي تحدّد مكان مجموعة النتائج التي تم الحصول عليها. value تمثل قيمة مجموعة النتائج التي تم الحصول عليها. الدوال الموروثة equals يبين إذا ما كان الكائن المُمرّر إليها يساوي الكائن الذي استدعي معه. hashCode يعيد الشيفرة ...
الصنف MatchGroup في Kotlin
يمثل الصنف MatchGroup النتائج التي نحصل عليها من مجموعة واحدة ضمن MatchResult الخاصة بالصنف Regex. data actual class MatchGroup
الدوال البانية <init> تنشئ كائنًا من النوع MatchGroup الذي يمثل النتائج التي نحصل عليها من مجموعة واحدة ضمن MatchResult الخاصة بالصنف Regex. الخاصيات range تمثل مجال الفهارس التي تحدّد مكان مجموعة النتائج التي تم الحصول عليها. value تمثل قيمة مجموعة النتائج التي تم الحصول عليها. الدوال الموروثة equals يبين إذا ما كان الكائن المُمرّر إليها يساوي الكائن الذي استدعي معه. hashCode يعيد الشيفرة ...
الخاصية Enum.name في Kotlin
تمثِّل الخاصية Enum.name اسم الثابت المعرف في الكائن enum الذي استُدعي معها كما سُمّي أُثناء تعريف هذا الكائن. البنية العامة val name: String
أمثلة يوضح المثال التالي كيفية إنشاء نسخة من الصنف Enum باسم ColorEnum مكونًا من أربعة ثوابت هي: Red و Blue و Green و Orange، واستعمال الخاصية Enum.name مع الثابتين RED و BLUE: fun main(args: Array<String>) {
print(ColorEnum.Red.name) // Red
print(ColorEnum.Blue.name) // Blue
}
enum class ColorEnum(val colorCode: Int)
{
Red(2),
Blue(11212),
...
الصنف StringBuilder في Kotlin
actual typealias StringBuilder = StringBuilder
منصة التشغيل والإصدار المطلوبان: JVM ،Kotlin 1.1 actual class StringBuilder : Appendable, CharSequence
منصة التشغيل المطلوبة: JS. الدوال البانية (Constructors) <init> تنشئ الدالة StringBuilder() كائنًا من النوع StringBuilder. الخاصيات length تمثل هذه الخاصية حجم الكائن StringBuilder (عدد محارفه) الذي استدعي معها. الدوال append تضيف هذه الدالة محرفًا أو سلسلة نصية أو أيَّ كائن آخر إلى الكائن StringBuilder. get تجلب هذه الدالة محرفًا ذا فهرس محدَّدٍ من سلسلة محارف الكائن StringBuilder. reverse تعكس هذه الدالة ترتيب محارف الكائن StringBuilder. subSequence تقتطع هذه الدالة جزءًا محددًا من سلسلة محارف الكائن StringBuilder وتعيدها. toString تحول هذه ...
الصنف StringBuilder في Kotlin
actual typealias StringBuilder = StringBuilder
منصة التشغيل والإصدار المطلوبان: JVM ،Kotlin 1.1 actual class StringBuilder : Appendable, CharSequence
منصة التشغيل المطلوبة: JS. الدوال البانية (Constructors) <init> تنشئ الدالة StringBuilder() كائنًا من النوع StringBuilder. الخاصيات length تمثل هذه الخاصية حجم الكائن StringBuilder (عدد محارفه) الذي استدعي معها. الدوال append تضيف هذه الدالة محرفًا أو سلسلة نصية أو أيَّ كائن آخر إلى الكائن StringBuilder. get تجلب هذه الدالة محرفًا ذا فهرس محدَّدٍ من سلسلة محارف الكائن StringBuilder. reverse تعكس هذه الدالة ترتيب محارف الكائن StringBuilder. subSequence تقتطع هذه الدالة جزءًا محددًا من سلسلة محارف الكائن StringBuilder وتعيدها. toString تحول هذه ...
الخاصية Enum.ordinal في Kotlin
تمثل الخاصية Enum.ordinal ترتيب (ordinal) الثابت المعرف في الكائن enum الذي استُدعي معها؛ أي موقعه في تصريح الكائن enum، إذ يكون موقع الثابت الأول هو 0 وهكذا. البنية العامة val ordinal: Int
أمثلة توضح الشيفرة التالية كيفية إنشاء صنف من النوع Enum باسم ColorEnum مكونًا من أربعة ثوابت هي: Red و Blue و Green و Orange، واستعمال الخاصية ordinal مع المركّبتين Red و Blue لمعرفة ترتيبهما: fun main(args: Array<String>) {
print(ColorEnum.Red.ordinal) // 0
print(ColorEnum.Blue.ordinal) // 1
}
enum class ColorEnum(val colorCode: Int)
{
...
الصنف Any في Kotlin
يعد الصنف Any الجذر الرئيسيّ في الهرميّة العامّة لأيّ صنفٍ مُستخدَمٍ في Kotlin؛ أي أنّ كلَّ صنفٍ سيكون له الصنف الأعلى (superclass) Any. open class Any
الدوال البانية <int> يعيد التابع Any() نسخةً من الصنف Any الذي هو الجذر الرئيسيّ في الهرميّة العامّة لأيّ صنفٍ مُستخدَمٍ أثناء البرمجة في Kotlin؛ أي أنّ كلَّ صنفٍ سيكون له الصنف الأعلى (superclass) Any. الدوال equals تتحقق الدالة equals() إذا ما كان الكائن المُمرّر إليها يساوي الكائن الذي استدعيت معها. hashCode تعيد الدالة hashCode() قيمة الشيفرة hash code الخاصّة بالكائن الذي ...
الصنف Boolean في Kotlin
يمثل الصنف Boolean قيمة منطقية وهي إما true أو false؛ في بيئة التشغيل JVM، القيم غير المعدومة (non-nullable) لهذا النوع تُمثَّل كقيم للنوع boolean الأساسي. class Boolean : Comparable<Boolean>
الدوال and تجري الدالة and() العملية and المنطقية بين قيمتين منطقيتين؛ خلافًا للمعامل &&، تتحقق هذه الدالة من كلا القيمتين المنطقيتين. compareTo توازن الدالة compareTo() بين قيمة العنصر الذي استُدعيت معه والقيمة المُمرّرة إليه ثمَّ تعيد القيمة 0 إن كانا متساويين، أو قيمة سالبة إن كانت القيمة الأولى (قيمة العنصر الذي استُدعيت معه) أصغر من القيمة الثانية، أو قيمة ...
الصنف Boolean في Kotlin
يمثل الصنف Boolean قيمة منطقية وهي إما true أو false؛ في بيئة التشغيل JVM، القيم غير المعدومة (non-nullable) لهذا النوع تُمثَّل كقيم للنوع boolean الأساسي. class Boolean : Comparable<Boolean>
الدوال and تجري الدالة and() العملية and المنطقية بين قيمتين منطقيتين؛ خلافًا للمعامل &&، تتحقق هذه الدالة من كلا القيمتين المنطقيتين. compareTo توازن الدالة compareTo() بين قيمة العنصر الذي استُدعيت معه والقيمة المُمرّرة إليه ثمَّ تعيد القيمة 0 إن كانا متساويين، أو قيمة سالبة إن كانت القيمة الأولى (قيمة العنصر الذي استُدعيت معه) أصغر من القيمة الثانية، أو قيمة ...
الصنف Destructured في Kotlin
يوفر الصنف Destructured مركبات الإسناد بالتفكيك (destructuring assignment) لمجموعة من القيم. يسمح الإسناد بالتفكيك باستخراج القيم الموجودة في المصفوفات أو المجموعات أو خاصيات أحد الكائنات ...إلخ. إلى متغيرات مستقلة. تطابق الدالة component1 قيمة المجموعة الأولى، وتطابق الدالة component2 قيمة المجموعة الثانية، وهلم جرًا. إن كانت المجموعة في التعبير النمطي اختيارية ولم ترصد هذه المجموعة أي عملية تطابق تُذكر، فيمكن حينئذٍ أن تساوي قيمة المكون المقابل لهذه المجموعة سلسلةً نصيةً فارغةً. class Destructured
الخاصيات match الدوال component1 component2 component3 component4 component5 component6 component7 ...
الصنف Destructured في Kotlin
يوفر الصنف Destructured مركبات الإسناد بالتفكيك (destructuring assignment) لمجموعة من القيم. يسمح الإسناد بالتفكيك باستخراج القيم الموجودة في المصفوفات أو المجموعات أو خاصيات أحد الكائنات ...إلخ. إلى متغيرات مستقلة. تطابق الدالة component1 قيمة المجموعة الأولى، وتطابق الدالة component2 قيمة المجموعة الثانية، وهلم جرًا. إن كانت المجموعة في التعبير النمطي اختيارية ولم ترصد هذه المجموعة أي عملية تطابق تُذكر، فيمكن حينئذٍ أن تساوي قيمة المكون المقابل لهذه المجموعة سلسلةً نصيةً فارغةً. class Destructured
الخاصيات match الدوال component1 component2 component3 component4 component5 component6 component7 ...
الدالة Enum.clone() في Kotlin
ترمي الدالة clone() استثناءً لأنّ ثوابت الصنف Enum لا يمكن أن تُنسَخ. تمنع هذه الدالة الأصناف ذات النوع Enum من أن ترِث من الصنف Cloneable. البنية العامة protected fun clone(): Any
أمثلة يؤدي استعمال الدالة clone() في المثال التالي إلى رمي استثناء: fun main(args: Array<String>) {
val x = ColorEnum.Red
val y = x.clone() // Error:(3, 14) Cannot access 'clone': it is protected in 'ColorEnum'
}
enum class ColorEnum(val colorCode: Int)
{
Red(2),
...
الدالة Enum.toString() في Kotlin
تحول الدالة toString() الكائن الذي استُدعي معها إلى سلسلة نصية (String). البنية العامة open fun toString(): String
القيمة المعادة تعاد سلسلة نصية تضم جميع محتويات الكائن المعطى. أمثلة استعمال الدالة toString() لتحويل أحد ثوابت نسخة أنشئت من الصنف Enum إلى سلسلة نصية: fun main(args: Array<String>) {
val x = ColorEnum.Red
print(x.toString()) // Red
}
enum class ColorEnum(val colorCode: Int)
{
Red(2),
Blue(11212),
Green(21212),
Orange(212121)
}
انظر ...
الانتقال الفرعيّ Delegation في Kotlin
أثبت نموذج الانتقال الفرعيّ فعّاليته كبديلٍ جيّدٍ عن وراثة تعريف الاستخدام (implementation inheritance) إذ تدعم لغة Kotlin هذه الميّزة بشكلٍ طبيعيّ دون الحاجة إلى أيّ نوع قياسيّ من الشيفرات، وبالتالي فإنّ الصنف المُشتقّ (Derived) يرِث من الواجهة (Base) وينقل فرعيًا (delegate) كلَّ توابعه العامّة (public methods) إلى كائنٍ مُحدَّدٍ، كما في الشيفرة الآتية: interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base ...
الدالة Enum.hashCode() في Kotlin
تعيد الدالة hashCode() الشيفرة Hash الخاصّة بالكائن الذي استُدعي معها. تُحقِّق هذه الدالة الشرطين الآتيين دائمًا: تعيد نفس العدد الصحيح دائمًا في كل مرة تستدعى فيها مع الكائن نفسه شريطة عدم تغيُّر أيّ معلومة تستخدمها الدالة equals() عند موازنة هذا الكائن مع غيره. إذا تساوى كائنان بحسب الدالة equals()، فيجب أن تعيد الدالة hashCode() شيفرة hash نفسها لكلٍّ منها. البنية العامة open fun hashCode(): Int
وجود الكلمة المفتاحيّة open هنا يدل على السماح بإعادة تعريف (override) هذا التابع في الأصناف الفرعيّة ...
التهيئة الأولية للصنف Any في Kotlin
تعيد الدالة Any() نسخةً من الصنف Any والذي هو الجذر الرئيسيّ في الهرميّة العامّة لأيّ صنفٍ مُستخدَمٍ أثناء البرمجة في Kotlin؛ أي أنّ كلَّ صنفٍ سيكون له الصنف الأعلى (superclass) Any. البنية العامة Any()
القيم المعادة يعاد كائنٌ (object) من الصنف Any. أمثلة تنشِئ الدالة Any() في الشيفرة الآتية كائنًا من الصنف Anyباسم obj ، ثم يُحدِّد صنف الكائن المُنشَأ وذلك بالاعتماد على خاصيّة الاسم البسيط للصنف (وهي class.simpleName) : fun main(args: Array<String>) {
val obj = Any()
println(" ${obj::class.simpleName}") // Any
}
انظر ...