המתודה _to_string
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 32 מתוך 65.
הדפסה של אובייקט שהמחלקה שלו אינה מגדירה את _to_string() מציגה רק את המחלקה שלו ואת מזהה פנימי, שמשתנה מהרצה להרצה: <RefCounted#-9223372009541466673>. הגדירו את _to_string() והחזירו את הטקסט שאמור להופיע במקום:
# card.gd
class_name Card
extends RefCounted
var rank: String
var suit: String
func _init(new_rank: String, new_suit: String) -> void:
rank = new_rank
suit = new_suit
func _to_string() -> String:
return rank + " of " + suitGodot קורא לה בכל פעם שהאובייקט הופך לטקסט: באמצעות print(), באמצעות str(), באמצעות %s במחרוזת עיצוב, ולכל אובייקט בתוך מערך או מילון שמודפסים:
var card := Card.new("Queen", "hearts")
print(card) # מלכת הלבבות
print(str(card)) # מלכת הלבבות
print("You drew %s" % card) # שלפת את מלכת הלבבות
print([card, Card.new("7", "clubs")]) # [מלכת הלבבות, 7 תלתן]"You drew " + card עדיין גורם לשגיאה, כי + מחבר שתי מחרוזות ו-card הוא אובייקט. המר אותו תחילה: "You drew " + str(card).
מחלקת משנה יכולה לדרוס את _to_string() ולהשתמש בטקסט של מחלקת האב באמצעות super():
# wild_card.gd
class_name WildCard
extends Card
func _to_string() -> String:
return "Wild " + super()print(WildCard.new("King", "spades")) מדפיס Wild King of spades.
_to_string() מחזירה את הטקסט ואינה מדפיסה דבר בעצמה. הקוד שמשתמש באובייקט קובע אם הטקסט יודפס, יצורף לשורה ארוכה יותר או יישמר.
אתגר
קלהוסיפו לשתי מחלקות מתודה בשם _to_string():
PlayingCardבקובץplaying_card.gdמכילהrankבין2ל־14ו־suit. הטקסט שלה הוא הדרגה,ofוהסוג, למשל7 of clubs. הדרגות11,12,13ו־14נכתבות כך:J,Q,Kו־A:Q of hearts.Handבקובץhand.gdשומרת את הקלפים שלה ב־_cards. הטקסט שלה הואHand (N):ואחריו הטקסטים של הקלפים, מחוברים באמצעות,, אוHand (0): emptyכאשר אין בה קלפים.
הקוד שסופק מדפיס את היד הריקה, קורא את מספר הקלפים ואז שורה אחת בפורמט RANK SUIT לכל קלף. הוא מוסיף כל קלף ליד, מדפיס את Drew ואת הקלף, ולבסוף מדפיס את היד. עבור הקלפים 7 clubs ו־12 hearts הוא מדפיס:
Hand (0): empty
Drew 7 of clubs
Drew Q of hearts
Hand (2): 7 of clubs, Q of heartsכתבו את הקוד שלכם בקבצים playing_card.gd ו־hand.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: השאירו אותו כפי שהוא
var hand := Hand.new()
print(hand)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var card := PlayingCard.new(int(parts[0]), parts[1])
hand.add(card)
print("Drew %s" % card)
print(hand)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין