Метод _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 " + suitGodot вызывает его каждый раз, когда объект преобразуется в текст: при вызове 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() возвращает текст и сам ничего не печатает. Код, использующий объект, определяет, будет ли текст напечатан, добавлен в более длинную строку или сохранён.
Задание
ЛегкоДобавь двум классам метод _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)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript