Menu
CoddyTech

Статические функции

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 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: обращение к score внутри is_passing() — это ошибка, о которой сообщается до запуска программы. Она может использовать свои параметры, константы, статические переменные и другие статические функции.

from_line() показывает распространённый способ использования: статическую функцию, которая создаёт и возвращает объект, в данном случае — из текстовой строки. Это второй способ создать Student, наряду с Student.new().

Вы также можете вызвать статическую функцию у объекта, как в ada.is_passing(50), но имя класса ясно показывает, что объект не задействован.

challenge icon

Задание

Легко

Напиши код для выставления оценок в двух классах.

В grader.gd класс Grader содержит только статические функции:

  • letter(points) возвращает "A" при 90 или больше, "B" при 80 или больше, "C" при 70 или больше, "D" при 60 или больше и "F" при значении ниже
  • is_passing(points) возвращает true при 60 или больше

Класс Student в student.gd уже содержит свои свойства и конструктор. Реализуй:

  • статическую функцию from_line(line), которая разделяет строку, например Ada 91, по пробелу и возвращает новый объект Student с этим именем и оценкой
  • метод report(), который возвращает NAME: SCORE (LETTER), passed или NAME: SCORE (LETTER), failed, используя обе функции Grader

Предоставленный код считывает количество следующих за ним студентов, создает объект для каждого с помощью 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