静态函数
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 10 课,共 65 课。
static func 属于类,就像静态变量一样。你可以通过类名调用它,无需对象,就像在文件课中那样:Greeter.greet("Ada")。类可以同时包含静态函数和普通方法:
# student.gd
class_name Student
extends RefCounted
static var count: int = 0
var student_name: String
var score: int
func _init(new_name: String, new_score: int) -> void:
student_name = new_name
score = new_score
count += 1
static func is_passing(points: int) -> bool:
return points >= 60
static func from_line(line: String) -> Student:
var parts := line.split(" ")
return Student.new(parts[0], int(parts[1]))print(Student.is_passing(72)) # true
var ada := Student.from_line("Ada 91")
print(ada.score) # 91
print(Student.count) # 1静态函数无需对象即可运行,因此不能使用实例变量或 self:在 is_passing() 中使用 score 会导致错误,该错误会在程序运行前报告。它可以使用自己的参数、常量、静态变量和其他静态函数。
from_line()展示了一种常见用法:静态函数根据一行文本构建并返回一个对象。这是创建 Student 的另一种方式,与 Student.new() 并列。
你也可以像 ada.is_passing(50) 这样在对象上调用静态函数,不过类名清楚地表明,这里并不涉及对象。
挑战
简单在两个类中编写评分代码。
grader.gd 中的 Grader 只有静态函数:
letter(points)在分数达到 90 或以上时返回"A",达到 80 或以上时返回"B",达到 70 或以上时返回"C",达到 60 或以上时返回"D",低于 60 时返回"F"is_passing(points)在分数达到 60 或以上时返回true
student.gd 中的 Student 已经有属性和构造函数。请完成:
- 静态函数
from_line(line),它会在空格处拆分一行文本,例如Ada 91,并使用姓名和分数创建并返回一个新的Student - 方法
report(),它使用两个Grader函数,返回NAME: SCORE (LETTER), passed或NAME: SCORE (LETTER), failed
提供的代码会读取后续学生的人数,为每位学生调用 Student.from_line() 创建对象,打印其报告,最后统计通过的学生人数。对于 Ada 91、Bo 42 和 Cy 75,输出如下:
Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3你的代码应写在 grader.gd 和 student.gd 中。main.gd 存放了提供的输入/输出代码,不能编辑。
亲手试试
extends Node
func _ready():
# 提供的输入/输出代码:保持原样
var count := int(OS.read_string_from_stdin())
var passed := 0
for i in count:
var student := Student.from_line(OS.read_string_from_stdin())
print(student.report())
if Grader.is_passing(student.score):
passed += 1
print("Passed: %d of %d" % [passed, count])
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器