Menu
CoddyTech

O método _to_string

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 32 de 65.

Imprimir um objeto cuja classe não define _to_string() mostra apenas sua classe e um ID interno, que muda de uma execução para outra: <RefCounted#-9223372009541466673>. Defina _to_string() e retorne o texto que deve aparecer no 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

O Godot chama isso toda vez que o objeto é convertido em texto: por print(), por str(), por %s em uma string de formato e para cada objeto dentro de um Array ou Dictionary impresso:

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 ainda é um erro, porque + concatena duas strings e card é um objeto. Converta-o primeiro: "You drew " + str(card).

Uma subclasse pode sobrescrever _to_string() e usar o texto da classe pai com 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() retorna o texto e não imprime nada por conta própria. O código que usa o objeto decide se o texto será impresso, concatenado a uma linha mais longa ou armazenado.

challenge icon

Desafio

Fácil

Dê a duas classes um método _to_string():

  • PlayingCard em playing_card.gd tem um rank de 2 a 14 e um suit. Seu texto é o valor de rank, of e o suit, como em 7 of clubs. Os valores 11, 12, 13 e 14 são escritos como J, Q, K e A: Q of hearts.
  • Hand em hand.gd mantém suas cartas em _cards. Seu texto é Hand (N): seguido pelos textos das cartas unidos com , , ou Hand (0): empty quando não tem cartas.

O código fornecido imprime a mão vazia, lê o número de cartas e, em seguida, uma linha RANK SUIT para cada carta. Ele adiciona cada carta à mão, imprime Drew e a carta e, por fim, imprime a mão. Para as cartas 7 clubs e 12 hearts, ele imprime:

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

Seu código deve ficar em playing_card.gd e hand.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online