Menu
CoddyTech

Phương thức _to_string

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 32 trên 65.

In ra một đối tượng có lớp không định nghĩa _to_string() chỉ hiển thị lớp và một ID nội bộ, thay đổi sau mỗi lần chạy: <RefCounted#-9223372009541466673>. Hãy định nghĩa _to_string() và trả về văn bản cần hiển thị thay thế:

# 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 gọi phương thức này mỗi khi biến đối tượng thành văn bản: khi dùng print(), str(), %s trong chuỗi định dạng và với từng đối tượng bên trong một Array hoặc Dictionary được in ra:

var card := Card.new("Queen", "hearts")
print(card) # Đầm cơ
print(str(card)) # Đầm cơ
print("You drew %s" % card) # Bạn rút được quân đầm cơ
print([card, Card.new("7", "clubs")]) # [Đầm cơ, 7 chuồn]

"You drew " + card vẫn gây lỗi, vì + nối hai chuỗi (string) còn card là một đối tượng. Hãy chuyển đổi nó trước: "You drew " + str(card).

Lớp con có thể ghi đè _to_string() và dùng văn bản của lớp cha với super():

# wild_card.gd
class_name WildCard
extends Card

func _to_string() -> String:
	return "Wild " + super()

print(WildCard.new("King", "spades")) in ra Wild King of spades.

_to_string() trả về văn bản và bản thân nó không in ra gì cả. Code sử dụng đối tượng sẽ quyết định văn bản được in ra, nối vào một dòng dài hơn hay lưu lại.

challenge icon

Thử thách

Dễ

Thêm phương thức _to_string() cho hai lớp:

  • PlayingCard trong playing_card.gd có rank từ 2 đến 14 và một suit. Nội dung dạng văn bản gồm thứ hạng, of và chất bài, chẳng hạn như 7 of clubs. Các thứ hạng 11, 12, 13 và 14 được viết là J, Q, K và A: Q of hearts.
  • Hand trong hand.gd lưu các lá bài trong _cards. Nội dung dạng văn bản là Hand (N): theo sau là nội dung của các lá bài được nối bằng , , hoặc Hand (0): empty nếu không có lá bài nào.

Code được cung cấp in ra bộ bài trống, đọc số lượng lá bài, rồi đọc một dòng RANK SUIT cho mỗi lá bài. Code thêm từng lá bài vào bộ bài, in ra Drew và lá bài đó, rồi cuối cùng in ra bộ bài. Với các lá bài 7 clubs và 12 hearts, chương trình in ra:

Hand (0): empty
Drew 7 of clubs
Drew Q of hearts
Hand (2): 7 of clubs, Q of hearts

Code của bạn nằm trong playing_card.gd và hand.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
	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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online