Menu
CoddyTech

Метод _to_string

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 32 из 65.

При выводе объекта, класс которого не определяет _to_string(), отображаются только его класс и внутренний ID, который меняется от запуска к запуску: <RefCounted#-9223372009541466673>. Определите _to_string() и верните текст, который должен отображаться вместо этого:

# 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 вызывает его каждый раз, когда объект преобразуется в текст: при вызове print(), str(), использовании %s в строке формата, а также для каждого объекта внутри выводимого Array или Dictionary:

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 по-прежнему вызывает ошибку, потому что + объединяет две строки, а card — это объект. Сначала преобразуй его: "You drew " + str(card).

Подкласс может переопределить _to_string() и использовать текст родительского класса с помощью super():

# wild_card.gd
class_name WildCard
extends Card

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

print(WildCard.new("King", "spades")) выводит Wild King of spades.

_to_string() возвращает текст и сам ничего не печатает. Код, использующий объект, определяет, будет ли текст напечатан, добавлен в более длинную строку или сохранён.

challenge icon

Задание

Легко

Добавь двум классам метод _to_string():

  • PlayingCard в playing_card.gd имеет rank от 2 до 14 и suit. Его текст состоит из ранга, of и масти, например 7 of clubs. Ранги 11, 12, 13 и 14 записываются как J, Q, K и A: Q of hearts.
  • Hand в hand.gd хранит свои карты в _cards. Его текст — это Hand (N): , за которым следуют тексты карт, объединённые с помощью , , либо Hand (0): empty, если карт нет.

Предоставленный код выводит пустую руку, считывает количество карт, а затем по одной строке RANK SUIT для каждой карты. Он добавляет каждую карту в руку, выводит Drew и карту, а в конце выводит руку. Для карт 7 clubs и 12 hearts он выводит:

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

Твой код нужно поместить в playing_card.gd и hand.gd. В main.gd находится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода/вывода: оставьте его без изменений
	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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript