Menu
CoddyTech

פונקציות סטטיות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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)) # אמת
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 אונליין