Menu
CoddyTech

El método _to_string

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 32 de 65.

Imprimir un objeto cuya clase no define _to_string() muestra solo su clase y un ID interno, que cambia de una ejecución a otra: <RefCounted#-9223372009541466673>. Define _to_string() y devuelve el texto que debería aparecer en su lugar:

# 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 llama cada vez que el objeto se convierte en texto: con print(), con str(), con %s en una cadena de formato y para cada objeto dentro de un Array o Dictionary impreso:

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 sigue siendo un error, porque + concatena dos cadenas y card es un objeto. Conviértelo primero: "You drew " + str(card).

Una subclase puede sobrescribir _to_string() y usar el texto de la clase padre con super():

# wild_card.gd
class_name WildCard
extends Card

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

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

_to_string() devuelve el texto y no imprime nada por sí mismo. El código que usa el objeto decide si se imprime el texto, se une a una línea más larga o se almacena.

challenge icon

Desafío

Fácil

Da a dos clases un método _to_string():

  • PlayingCard en playing_card.gd tiene un rank del 2 al 14 y un suit. Su texto es el rango, of y el palo, como 7 of clubs. Los rangos 11, 12, 13 y 14 se escriben J, Q, K y A: Q of hearts.
  • Hand en hand.gd guarda sus cartas en _cards. Su texto es Hand (N): seguido de los textos de las cartas unidos con , , o Hand (0): empty cuando no tiene cartas.

El código proporcionado imprime la mano vacía, lee el número de cartas y después una línea RANK SUIT por cada carta. Añade cada carta a la mano, imprime Drew y la carta, y finalmente imprime la mano. Para las cartas 7 clubs y 12 hearts, imprime:

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

Tu código va en playing_card.gd y hand.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online