Menu
CoddyTech

self 关键字

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 4 课,共 65 课。

在类中声明的函数会作用于某个特定对象:也就是调用时点号前面的对象。在函数内部,关键字 self 指的是该对象。

# 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() 会在 self 设置为 my_car 的情况下运行 describe(),因此函数会读取那辆车的变量。你不需要自己传入 self:

var my_car := Car.new()
var taxi := Car.new()
taxi.color = "Yellow"
my_car.describe() # 我是一辆红色轿车
taxi.describe() # 我是一辆黄色轿车

写出 self. 是可选的。在类函数内部,单独写 color 就已经表示对象的 color,所以 print("I am a %s %s" % [color, model]) 的效果相同。

当参数与类的变量同名时,你需要使用 self。在函数内部,这个名称表示参数,而 self. 用来指定对象的变量:

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

如果没有 self.,color = color 这一行会把参数赋值给自身,汽车会保留原来的颜色。

challenge icon

挑战

简单

完成类 Car 中的两个函数,代码写在 car.gd 中:

  • set_info(year, make, model) 将三个参数分别存储到汽车中同名的变量里
  • describe() 返回 This car is a YEAR MAKE MODEL,例如 This car is a 2020 Toyota Corolla

提供的代码会读取后续汽车的数量,然后为每辆汽车读取一行输入(year make model)。它会创建每辆汽车,调用 set_info(),并打印每辆汽车的 describe()。对于输入行 2020 Toyota Corolla,它会打印:

This car is a 2020 Toyota Corolla

你的代码应写在 car.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。

亲手试试

extends Node

func _ready():
	# 提供的输入输出代码:保持原样。
	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 icon自我测试

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

面向对象编程中的所有课

自己练习: GDScript 在线编译器