_to_string 方法
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 32 课,共 65 课。
打印一个未定义 _to_string() 的类的对象时,只会显示它的类名和一个内部 ID,这个 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) # 红心皇后
print(str(card)) # 红心皇后
print("You drew %s" % card) # 你抽到了红心皇后
print([card, Card.new("7", "clubs")]) # [红心皇后, 梅花 7]"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中有一个从2到14的rank和一个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)
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器