Menu
CoddyTech

Từ khóa self

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 4 trên 65.

Một hàm được khai báo trong lớp sẽ chạy trên một đối tượng cụ thể: đối tượng đứng trước dấu chấm trong lời gọi. Bên trong hàm, từ khóa self tham chiếu đến đối tượng đó.

# car.gd
class_name Car
extends RefCounted

var color: String = "Red"
var model: String = "Sedan"

func describe() -> void:
	print("I am a %s %s" % [self.color, self.model])

my_car.describe() chạy describe() với self được đặt thành my_car, vì vậy hàm đọc các biến của chiếc xe đó. Bạn không bao giờ tự truyền self:

var my_car := Car.new()
var taxi := Car.new()
taxi.color = "Yellow"
my_car.describe() # Mình là một chiếc xe sedan màu đỏ
taxi.describe() # Mình là một chiếc xe sedan màu vàng

Viết self. là tùy chọn. Bên trong hàm của một lớp, chỉ viết color cũng đã có nghĩa là thuộc tính color của đối tượng, nên print("I am a %s %s" % [color, model]) cũng cho kết quả tương tự.

Bạn cần self khi tham số có cùng tên với một biến của lớp. Bên trong hàm (function), tên đó chỉ tham số, còn self. dùng để truy cập biến của đối tượng:

func repaint(color: String) -> void:
	self.color = color

Nếu không có self., dòng color = color sẽ gán tham số cho chính nó, còn chiếc xe vẫn giữ màu cũ.

challenge icon

Thử thách

Dễ

Hoàn thiện hai hàm của lớp Car trong car.gd:

  • set_info(year, make, model) lưu ba tham số vào các biến của xe có cùng tên
  • describe() trả về This car is a YEAR MAKE MODEL, ví dụ This car is a 2020 Toyota Corolla

Code được cung cấp đọc số lượng xe tiếp theo, sau đó đọc một dòng cho mỗi xe (year make model). Code tạo từng xe, gọi set_info() và in ra kết quả của describe() cho mỗi xe. Với dòng 2020 Toyota Corolla, chương trình in ra:

This car is a 2020 Toyota Corolla

Viết code của bạn trong car.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 có sẵn: giữ nguyên
	var count := int(OS.read_string_from_stdin())
	var cars: Array[Car] = []
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var car := Car.new()
		car.set_info(int(parts[0]), parts[1], parts[2])
		cars.append(car)
	for car in cars:
		print(car.describe())
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