Menu
CoddyTech

Funzioni statiche

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 10 di 65.

Una static func appartiene alla classe, come una variabile statica. La richiami tramite il nome della classe, senza un oggetto, come hai fatto nella lezione sui file: Greeter.greet("Ada"). Una classe può combinare funzioni statiche e metodi ordinari:

# 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 funzione statica viene eseguita senza un oggetto, quindi non può usare variabili di istanza o self: score all’interno di is_passing() è un errore segnalato prima che il programma venga eseguito. Può usare i suoi parametri, le costanti, le variabili statiche e altre funzioni statiche.

from_line() mostra un uso comune: una funzione statica che crea e restituisce un oggetto, in questo caso a partire da una riga di testo. È un secondo modo per creare uno Student, oltre a Student.new().

Puoi anche chiamare una funzione statica su un oggetto, come in ada.is_passing(50), ma il nome della classe chiarisce che non è coinvolto alcun oggetto.

challenge icon

Sfida

Facile

Scrivi il codice di valutazione in due classi.

Grader in grader.gd ha solo funzioni statiche:

  • letter(points) restituisce "A" per 90 o più, "B" per 80 o più, "C" per 70 o più, "D" per 60 o più e "F" al di sotto
  • is_passing(points) restituisce true per 60 o più

Student in student.gd ha già le sue proprietà e il costruttore. Completa:

  • la funzione statica from_line(line), che divide una riga come Ada 91 in corrispondenza dello spazio e restituisce un nuovo Student con quel nome e quel punteggio
  • il metodo report(), che restituisce NAME: SCORE (LETTER), passed oppure NAME: SCORE (LETTER), failed, usando le due funzioni di Grader

Il codice fornito legge quanti studenti seguono, crea ciascuno con Student.from_line(), stampa il relativo resoconto e infine conta gli studenti promossi. Per Ada 91, Bo 42 e Cy 75 stampa:

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

Il tuo codice va in grader.gd e student.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online