Menu
CoddyTech

Il metodo _to_string

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 32 di 65.

Stampare un oggetto la cui classe non definisce _to_string() mostra solo la sua classe e un ID interno, che cambia da un'esecuzione all'altra: <RefCounted#-9223372009541466673>. Definisci _to_string() e restituisci il testo che dovrebbe apparire al suo posto:

# 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 lo chiama ogni volta che l’oggetto viene convertito in testo: con print(), con str(), con %s in una stringa di formato e per ogni oggetto all’interno di un Array o Dictionary stampato:

var card := Card.new("Queen", "hearts")
print(card) # Queen of hearts
print(str(card)) # Queen of hearts
print("You drew %s" % card) # You drew Queen of hearts
print([card, Card.new("7", "clubs")]) # [Queen of hearts, 7 of clubs]

"You drew " + card è ancora un errore, perché + concatena due stringhe e card è un oggetto. Convertilo prima: "You drew " + str(card).

Una sottoclasse può eseguire l'override di _to_string() e usare il testo della classe genitore con super():

# wild_card.gd
class_name WildCard
extends Card

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

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

_to_string() restituisce il testo e non stampa nulla. È il codice che usa l'oggetto a decidere se stampare il testo, unirlo a una riga più lunga o memorizzarlo.

challenge icon

Sfida

Facile

Assegna a due classi un metodo _to_string():

  • PlayingCard in playing_card.gd ha un rank da 2 a 14 e un suit. Il suo testo è il rango, of e il seme, ad esempio 7 of clubs. I ranghi 11, 12, 13 e 14 si scrivono J, Q, K e A: Q of hearts.
  • Hand in hand.gd conserva le sue carte in _cards. Il suo testo è Hand (N): seguito dai testi delle carte uniti con , , oppure Hand (0): empty quando non contiene carte.

Il codice fornito stampa la mano vuota, legge il numero di carte e poi una riga RANK SUIT per ogni carta. Aggiunge ogni carta alla mano, stampa Drew e la carta, quindi stampa la mano. Per le carte 7 clubs e 12 hearts stampa:

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

Il tuo codice va in playing_card.gd e hand.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Supplied input/output code: keep it as it is
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online