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 这一行会把参数赋值给自身,汽车会保留原来的颜色。
挑战
简单完成类 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())
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器