copy وequals
الدوال المُولّدة
copy وequals درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
الدوال المُولّدة
بالإضافة إلى toString، تولّد فئة البيانات equals وhashCode وcopy.
تجعل هذه الدوال الثلاث فئات البيانات ممتعة للمقارنة والاستنساخ.
المساواة البنيوية
تقارن equals المُولّدة بين الكائنات استنادًا إلى قيم خصائصها، لا إلى هويتها.
يكون مثيلا فئة البيانات اللذان يحملان القيم نفسها متساويين عند استخدام ==.
data class User(val name: String, val age: Int)
fun main() {
val a = User("Alice", 30)
val b = User("Alice", 30)
println(a == b)
}القيم المختلفة ليست متساوية
غيّر أي خاصية، ولن يعود الكائنان متساويين.
تُحسَب المساواة من كل خاصية في المُنشئ الأساسي.
data class User(val name: String, val age: Int)
fun main() {
val a = User("Alice", 30)
val b = User("Alice", 31)
println(a == b)
}المساواة مقابل الهوية
استخدم == للمساواة بالقيمة (المساواة البنيوية)، و=== للمساواة بالمرجع (مساواة الهوية).
يمكن أن يكون كائنان متساويان من البيانات مثيلين مختلفين في الذاكرة.
data class User(val name: String)
fun main() {
val a = User("Alice")
val b = User("Alice")
println(a == b) // values match
println(a === b) // different instances
}اتساق hashCode
يُولّد hashCode بما يتوافق مع equals: فالكائنات المتساوية تنتج قيمة hash نفسها.
وهذا ما يجعل فئات البيانات تعمل بصورة صحيحة داخل المجموعات وبوصفها مفاتيح للخرائط.
data class Point(val x: Int, val y: Int)
fun main() {
val a = Point(1, 2)
val b = Point(1, 2)
println(a.hashCode() == b.hashCode())
}الدالة copy
تنشئ copy كائنًا جديدًا مطابقًا للكائن الأصلي.
ومع الخصائص غير القابلة للتغيير من نوع val، تكون عملية النسخ هي الطريقة لإنشاء نسخة معدّلة.
data class User(val name: String, val age: Int)
fun main() {
val a = User("Alice", 30)
val b = a.copy()
println(b)
println(a == b)
}النسخ مع إجراء تغييرات
مرّر معاملات مسمّاة إلى copy لتغيير خصائص محددة مع إبقاء بقية الخصائص كما هي.
هذا هو النمط القياسي لتحديث البيانات غير القابلة للتغيير.
data class User(val name: String, val age: Int)
fun main() {
val a = User("Alice", 30)
val older = a.copy(age = 31)
println(a)
println(older)
}يُبقي النسخ على الأصل دون تغيير
لا يغيّر copy الكائن المصدر أبدًا. إذ يحتفظ الأصل بقيمه.
تجعل قابلية عدم التغيير هذه تغييرات الحالة متوقعة وآمنة.
data class Account(val owner: String, val balance: Int)
fun main() {
val original = Account("Sam", 100)
val updated = original.copy(balance = 150)
println(original.balance)
println(updated.balance)
}تسلسل عمليات النسخ
بما أن copy يعيد كائنًا جديدًا، يمكنك تطبيق عدة تحديثات بالتسلسل.
ينتج كل إجراء قيمة جديدة ومستقلة.
data class Config(val volume: Int, val muted: Boolean)
fun main() {
val base = Config(50, false)
val result = base.copy(volume = 70).copy(muted = true)
println(result)
}تُحتسب خصائص المُنشئ فقط
كما هي الحال مع المساواة، يتعامل copy مع خصائص المُنشئ الأساسي فقط.
تُعاد خصائص الجسم إلى قيمها الافتراضية في النسخة، لذا احتفظ بالحالة المهمة في المُنشئ.
data class User(val name: String) {
var note: String = "none"
}
fun main() {
val a = User("Alice")
a.note = "VIP"
val b = a.copy()
println(b.note) // back to default
}جمع المفاهيم
تمنح الدوال المُولّدة فئات البيانات قوتها:
- يقارن
equalsو==حسب القيمة - يبقى
hashCodeمتوافقًا مع equals - ينشئ
copyنسخة مع تغييرات اختيارية
data class User(val name: String, val age: Int)
fun main() {
val a = User("Alice", 30)
val b = a.copy(name = "Alicia")
println(a == b)
println(b)
}اختبار سريع
اختبر مدى فهمك لـ copy وequals.
مراجعة
لقد تعلّمت الدوال المُولّدة لفئات البيانات:
- تقارن equals حسب القيمة، مع الفرق بين
==و=== - يحافظ hashCode على اتساقه مع المجموعات
- ينشئ copy نسخة مع تغييرات محددة
ستتعلّم بعد ذلك كيفية تفكيك الكائنات إلى متغيرات.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «copy وequals» مجاني؟
نعم — نص درس «copy وequals» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «copy وequals»؟
الدوال المُولّدة تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «copy وequals»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.