Menu
CoddyTech

Metoda _to_string

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 32 z 65.

Wyświetlenie obiektu, którego klasa nie definiuje _to_string(), pokazuje tylko jego klasę i wewnętrzny identyfikator, który zmienia się przy każdym uruchomieniu: <RefCounted#-9223372009541466673>. Zdefiniuj _to_string() i zwróć tekst, który powinien pojawić się zamiast tego:

# 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 wywołuje ją za każdym razem, gdy obiekt jest zamieniany na tekst: przez print(), przez str(), przez %s w ciągu formatującym oraz dla każdego obiektu wewnątrz wypisywanej tablicy lub słownika:

var card := Card.new("Queen", "hearts")
print(card) # Dama kier
print(str(card)) # Dama kier
print("You drew %s" % card) # Dobrałeś damę kier
print([card, Card.new("7", "clubs")]) # [Dama kier, 7 trefl]

"You drew " + card nadal powoduje błąd, ponieważ + łączy dwa ciągi znaków, a card jest obiektem. Najpierw przekonwertuj go: "You drew " + str(card).

Podklasa może przesłonić _to_string() i użyć tekstu klasy nadrzędnej za pomocą super():

# wild_card.gd
class_name WildCard
extends Card

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

print(WildCard.new("King", "spades")) wyświetla Wild King of spades.

_to_string() zwraca tekst i sam niczego nie wyświetla. Kod korzystający z obiektu decyduje, czy tekst zostanie wyświetlony, połączony w dłuższy wiersz czy zapisany.

challenge icon

Wyzwanie

Łatwy

Dodaj metodę _to_string() do dwóch klas:

  • PlayingCard w pliku playing_card.gd ma rank od 2 do 14 oraz suit. Jego tekst to ranga, of i kolor, na przykład 7 of clubs. Rangi 11, 12, 13 i 14 zapisuje się jako J, Q, K i A: Q of hearts.
  • Hand w pliku hand.gd przechowuje karty w _cards. Jego tekst to Hand (N): , a po nim teksty kart połączone za pomocą , , lub Hand (0): empty, gdy nie ma w nim kart.

Dostarczony kod wyświetla pustą rękę, odczytuje liczbę kart, a następnie po jednym wierszu RANK SUIT dla każdej karty. Dodaje każdą kartę do ręki, wyświetla Drew i kartę, a na końcu wyświetla rękę. Dla kart 7 clubs i 12 hearts wyświetla:

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

Twój kod umieść w plikach playing_card.gd i hand.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online