Menu
CoddyTech

Die _to_string-Methode

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 32 von 65.

Beim Ausgeben eines Objekts, dessen Klasse _to_string() nicht definiert, werden nur dessen Klasse und eine interne ID angezeigt, die sich bei jedem Durchlauf ändert: <RefCounted#-9223372009541466673>. Definiere _to_string() und gib den Text zurück, der stattdessen erscheinen soll:

# 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 " + suit

Godot ruft es jedes Mal auf, wenn das Objekt in Text umgewandelt wird: durch print(), durch str(), durch %s in einer Formatzeichenfolge und für jedes Objekt in einem ausgegebenen Array oder Dictionary:

var card := Card.new("Queen", "hearts")
print(card) # Herz-Dame
print(str(card)) # Herz-Dame
print("You drew %s" % card) # Du hast die Herz-Dame gezogen
print([card, Card.new("7", "clubs")]) # [Herz-Dame, Kreuz-7]

"You drew " + card ist weiterhin ein Fehler, weil + zwei Strings verknüpft und card ein Objekt ist. Wandle es zuerst um: "You drew " + str(card).

Eine Unterklasse kann _to_string() überschreiben und den Text der Elternklasse mit super() verwenden:

# wild_card.gd
class_name WildCard
extends Card

func _to_string() -> String:
	return "Wild " + super()

print(WildCard.new("King", "spades")) gibt Wild King of spades aus.

_to_string() gibt den Text zurück und gibt selbst nichts aus. Der Code, der das Objekt verwendet, entscheidet, ob der Text ausgegeben, zu einer längeren Zeile zusammengefügt oder gespeichert wird.

challenge icon

Aufgabe

Einfach

Gib zwei Klassen eine _to_string()-Methode:

  • PlayingCard in playing_card.gd hat einen rank von 2 bis 14 und eine suit. Sein Text besteht aus dem Rang, of und der Farbe, zum Beispiel 7 of clubs. Die Ränge 11, 12, 13 und 14 werden als J, Q, K und A geschrieben: Q of hearts.
  • Hand in hand.gd speichert seine Karten in _cards. Sein Text ist Hand (N): , gefolgt von den Texten der Karten, verbunden mit , , oder Hand (0): empty, wenn sie keine Karten enthält.

Der vorgegebene Code gibt die leere Hand aus, liest die Anzahl der Karten und dann eine RANK SUIT-Zeile pro Karte. Er fügt jede Karte der Hand hinzu, gibt Drew und die Karte aus und gibt schließlich die Hand aus. Für die Karten 7 clubs und 12 hearts gibt er Folgendes aus:

Hand (0): empty
Drew 7 of clubs
Drew Q of hearts
Hand (2): 7 of clubs, Q of hearts

Dein Code gehört in playing_card.gd und hand.gd. main.gd enthält den vorgegebenen Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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)
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler