مراجعة - قائمة مخصصة
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 34 من 65.
التحدي
متوسطاكتب CustomList في custom_list.gd، وهو صنف يغلّف مصفوفة خاصة _items ويوفّر ما تحتاج إليه القائمة من خلال الدوال والدوال الافتراضية:
- تخزّن
_init(items = [])نسخة منitems، كي لا تؤثر التغييرات اللاحقة على المصفوفة المُمرَّرة في القائمة. - تضيف
append(item)عنصرًا في النهاية. تحذفpop_back()العنصر الأخير وتعيده، أو تعيدnullعندما تكون القائمة فارغة. - تعيد
get_at(index)العنصر، أوnullعندما يكون الفهرس خارج النطاق من0إلىsize() - 1. تستبدلset_at(index, value)العنصر وتعيدtrue، أو تعيدfalseإذا كان الفهرس خارج القائمة. - تعمل
size()وhas(item)وclear()مثل دوال Array التي تحمل الأسماء نفسها. - تحل
concat(other)محل العامل+: فهي تعيدCustomListجديدة تحتوي على عناصر هذه القائمة، تليها عناصرother، ولا تغيّر أيًا من القائمتين. - تعيد
_to_string()العناصر بالطريقة التي تُطبع بها المصفوفة، مثل[3, 1, 4]. - تتيح
_iter_init()و_iter_next()و_iter_get()لحلقةforالمرور على العناصر.
يقرأ الكود المرفق الأعداد الأولية (في سطر واحد، تفصل بينها مسافات، وقد يكون السطر فارغًا)، وينشئ القائمة، ويضيف 99 إلى المصفوفة التي مرّرها، ثم يطبع القائمة. بعد ذلك يقرأ عدد الأوامر وينفّذ أمرًا واحدًا في كل سطر: append N وpop وget I وset I N وhas N وsize وsum (حلقة for تمرّ على القائمة) وclear وconcat N N .... بالنسبة إلى هذا الإدخال:
3 1 4
8
append 1
get 2
get 9
set 0 5
has 4
sum
pop
concat 9 2تكون المخرجات:
[3, 1, 4]
[3, 1, 4, 1]
Item 2: 4
No item at 9
[5, 1, 4, 1]
Has 4: true
Sum: 11
Popped 1
[5, 1, 4] + [9, 2] = [5, 1, 4, 9, 2]ضع الكود في custom_list.gd. يحتوي main.gd على كود الإدخال والإخراج المرفق، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# رمز الإدخال والإخراج المقدَّم: اتركه كما هو
var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
var list := CustomList.new(numbers)
# يجب أن تحتفظ القائمة بنسختها الخاصة
numbers.append(99)
print(list)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", false)
match parts[0]:
"append":
list.append(int(parts[1]))
print(list)
"pop":
var item = list.pop_back()
print("Empty" if item == null else "Popped %d" % item)
"get":
var item = list.get_at(int(parts[1]))
print(("No item at " + parts[1]) if item == null else "Item %s: %d" % [parts[1], item])
"set":
if list.set_at(int(parts[1]), int(parts[2])):
print(list)
else:
print("No item at " + parts[1])
"has":
print("Has %s: %s" % [parts[1], list.has(int(parts[1]))])
"size":
print("Size: %d" % list.size())
"sum":
var total := 0
for item in list:
total += item
print("Sum: %d" % total)
"clear":
list.clear()
print(list)
"concat":
var other := CustomList.new(to_numbers(parts.slice(1)))
print("%s + %s = %s" % [list, other, list.concat(other)])
func to_numbers(words: PackedStringArray) -> Array:
var result := []
for word in words:
result.append(int(word))
return result
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت