Menu
CoddyTech

Funciones estáticas

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 10 de 65.

Una static func pertenece a la clase, como una variable estática. La llamas a través del nombre de la clase, sin un objeto, como hiciste en la lección sobre archivos: Greeter.greet("Ada"). Una clase puede combinar funciones estáticas con métodos ordinarios:

# 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

Una función estática se ejecuta sin un objeto, así que no puede usar variables de instancia ni self: score dentro de is_passing() es un error que se informa antes de que se ejecute el programa. Puede usar sus parámetros, constantes, variables estáticas y otras funciones estáticas.

from_line() muestra un uso común: una función estática que construye y devuelve un objeto, en este caso a partir de una línea de texto. Es una segunda forma de crear un Student, además de Student.new().

También puedes llamar a una función estática en un objeto, como en ada.is_passing(50), pero el nombre de la clase deja claro que no interviene ningún objeto.

challenge icon

Desafío

Fácil

Escribe el código de calificación en dos clases.

Grader en grader.gd tiene solo funciones estáticas:

  • letter(points) devuelve "A" para 90 o más, "B" para 80 o más, "C" para 70 o más, "D" para 60 o más y "F" por debajo de eso
  • is_passing(points) devuelve true para 60 o más

Student en student.gd ya tiene sus propiedades y su constructor. Completa:

  • la función estática from_line(line), que divide una línea como Ada 91 por el espacio y devuelve un nuevo Student con ese nombre y esa puntuación
  • el método report(), que devuelve NAME: SCORE (LETTER), passed o NAME: SCORE (LETTER), failed, usando las dos funciones de Grader

El código proporcionado lee cuántos estudiantes vienen a continuación, crea cada uno con Student.from_line(), imprime su informe y, por último, cuenta los estudiantes que aprobaron. Para Ada 91, Bo 42 y Cy 75, imprime:

Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3

Tu código va en grader.gd y student.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online