Menu
CoddyTech

_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 " + 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 仍然会报错,因为 + 用于连接两个字符串,而 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 中有一个从 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)
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: GDScript 在线编译器