Menu
CoddyTech

La méthode _to_string

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 32 sur 65.

Afficher un objet dont la classe ne définit pas _to_string() ne montre que sa classe et un identifiant interne, qui change d’une exécution à l’autre : <RefCounted#-9223372009541466673>. Définissez _to_string() et renvoyez le texte qui doit apparaître à la place :

# 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 l’appelle chaque fois que l’objet est converti en texte : avec print(), avec str(), avec %s dans une chaîne de formatage, et pour chaque objet d’un Array ou d’un Dictionary affiché :

var card := Card.new("Queen", "hearts")
print(card) # Dame de cœur
print(str(card)) # Dame de cœur
print("You drew %s" % card) # Vous avez tiré la dame de cœur
print([card, Card.new("7", "clubs")]) # [Dame de cœur, 7 de trèfle]

"You drew " + card est toujours une erreur, car + concatène deux chaînes et card est un objet. Convertis-le d’abord : "You drew " + str(card).

Une sous-classe peut redéfinir _to_string() et utiliser le texte de la classe parente avec super() :

# wild_card.gd
class_name WildCard
extends Card

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

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

_to_string() renvoie le texte et n’affiche rien lui-même. Le code qui utilise l’objet décide si le texte est affiché, intégré à une ligne plus longue ou stocké.

challenge icon

Défi

Facile

Donnez à deux classes une méthode _to_string() :

  • PlayingCard dans playing_card.gd a un rank compris entre 2 et 14 et un suit. Son texte est le rang, of et la couleur, par exemple 7 of clubs. Les rangs 11, 12, 13 et 14 s’écrivent J, Q, K et A : Q of hearts.
  • Hand dans hand.gd conserve ses cartes dans _cards. Son texte est Hand (N): suivi des textes des cartes joints avec , , ou Hand (0): empty s’il ne contient aucune carte.

Le code fourni affiche la main vide, lit le nombre de cartes, puis une ligne RANK SUIT par carte. Il ajoute chaque carte à la main, affiche Drew et la carte, puis affiche la main. Pour les cartes 7 clubs et 12 hearts, il affiche :

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

Votre code va dans playing_card.gd et hand.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : conservez-le tel quel
	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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne