Menu
CoddyTech
flag Ar iconالعربيةdown icon

الدوال الساكنة

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 10 من 65.

تنتمي static func إلى الصنف، مثل المتغير الساكن. تستدعيها من خلال اسم الصنف، من دون كائن، كما فعلت في درس الملفات: Greeter.greet("Ada"). يمكن للصنف أن يجمع بين الدوال الساكنة والأساليب العادية:

# student.gd
class_name Student
extends RefCounted

static var count: int = 0
var student_name: String
var score: int

func _init(new_name: String, new_score: int) -> void:
	student_name = new_name
	score = new_score
	count += 1

static func is_passing(points: int) -> bool:
	return points >= 60

static func from_line(line: String) -> Student:
	var parts := line.split(" ")
	return Student.new(parts[0], int(parts[1]))
print(Student.is_passing(72)) # true
var ada := Student.from_line("Ada 91")
print(ada.score) # 91
print(Student.count) # 1

تعمل الدالة الساكنة دون كائن، لذا لا يمكنها استخدام متغيرات النسخة أو self: يُعدّ استخدام score داخل is_passing() خطأً يُبلّغ عنه قبل تشغيل البرنامج. ويمكنها استخدام معلماتها والثوابت والمتغيرات الساكنة والدوال الساكنة الأخرى.

توضّح from_line() استخدامًا شائعًا: دالة ثابتة تنشئ كائنًا وتُعيده، وهنا يكون الكائن مُنشأً من سطر نصي. وهي طريقة ثانية لإنشاء Student، إلى جانب Student.new().

يمكنك أيضًا استدعاء دالة ثابتة على كائن، كما في ada.is_passing(50)، لكن اسم الصنف يوضح أنه لا يوجد كائن مشارك.

challenge icon

التحدي

سهل

اكتب كود التقييم في فئتين.

تحتوي Grader في grader.gd على دوال ساكنة فقط:

  • تعيد letter(points) القيمة "A" إذا كانت الدرجة 90 أو أكثر، و"B" إذا كانت 80 أو أكثر، و"C" إذا كانت 70 أو أكثر، و"D" إذا كانت 60 أو أكثر، و"F" فيما دون ذلك
  • تعيد is_passing(points) القيمة true إذا كانت الدرجة 60 أو أكثر

تحتوي Student في student.gd بالفعل على خصائصها وبانيتها. أكمل ما يلي:

  • الدالة الساكنة from_line(line)، التي تقسّم سطرًا مثل Ada 91 عند المسافة وتعيد كائن Student جديدًا بهذا الاسم والدرجة
  • الطريقة report()، التي تعيد NAME: SCORE (LETTER), passed أو NAME: SCORE (LETTER), failed باستخدام دالتي Grader

يقرأ الكود المرفق عدد الطلاب الذين تليهم البيانات، وينشئ كائنًا لكل منهم باستخدام Student.from_line()، ويطبع تقريره، ثم يحصي الطلاب الناجحين. بالنسبة إلى Ada 91 وBo 42 وCy 75، يطبع:

Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3

ضع الكود في grader.gd وstudent.gd. يحتوي main.gd على كود الإدخال والإخراج المرفق، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# كود الإدخال/الإخراج المقدَّم: اتركه كما هو
	var count := int(OS.read_string_from_stdin())
	var passed := 0
	for i in count:
		var student := Student.from_line(OS.read_string_from_stdin())
		print(student.report())
		if Grader.is_passing(student.score):
			passed += 1
	print("Passed: %d of %d" % [passed, count])
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت