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 " + suitO 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.
Desafio
FácilDê a duas classes um método _to_string():
PlayingCardemplaying_card.gdtem umrankde2a14e umsuit. Seu texto é o valor de rank,ofe o suit, como em7 of clubs. Os valores11,12,13e14são escritos comoJ,Q,KeA:Q of hearts.Handemhand.gdmantém suas cartas em_cards. Seu texto éHand (N):seguido pelos textos das cartas unidos com,, ouHand (0): emptyquando 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 heartsSeu 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)
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
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online