_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 " + suitGodotは、オブジェクトがテキストに変換されるたびにこれを呼び出します。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()はテキストを返しますが、それ自体は何も出力しません。オブジェクトを使うコードが、テキストを出力するか、より長い行に連結するか、保存するかを決定します。
チャレンジ
簡単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)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ