Menu
CoddyTech

_to_string メソッド

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 32/65。

_to_string()を定義していないクラスのオブジェクトを出力すると、クラス名と内部IDだけが表示されます。このIDは実行するたびに変わります: <RefCounted#-9223372009541466673></code。代わりに表示するテキストを返す<code>_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) # ハートのクイーン
print(str(card)) # ハートのクイーン
print("You drew %s" % card) # ハートのクイーンを引きました
print([card, Card.new("7", "clubs")]) # [ハートのクイーン, クラブの7]

"You drew " + card はまだエラーです。+ は2つのStringを連結しますが、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

チャレンジ

簡単

2つのクラスに_to_string()メソッドを用意します。

  • playing_card.gdのPlayingCardは、2から14までのrankとsuitを持ちます。文字列はrank、 of 、suitをつなげたもので、たとえば7 of clubsのようになります。11、12、13、14のrankはそれぞれJ、Q、K、Aと表記します。例:Q of hearts。
  • hand.gdのHandは、カードを_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オンラインコンパイラ