Menu
CoddyTech

静态函数

本课属于 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) 这样在对象上调用静态函数,不过类名清楚地表明,这里并不涉及对象。

challenge icon

挑战

简单

在两个类中编写评分代码。

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])
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: GDScript 在线编译器