Menu
CoddyTech

Funções Estáticas

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 10 de 65.

Uma static func pertence à classe, como uma variável estática. Você a chama pelo nome da classe, sem um objeto, como fez na lição sobre arquivos: Greeter.greet("Ada"). Uma classe pode combinar funções estáticas com métodos comuns:

# 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

Uma função estática é executada sem um objeto, então não pode usar variáveis de instância nem self: score dentro de is_passing() é um erro relatado antes de o programa ser executado. Ela pode usar seus parâmetros, constantes, variáveis estáticas e outras funções estáticas.

from_line() mostra um uso comum: uma função estática que cria e retorna um objeto, neste caso, a partir de uma linha de texto. É uma segunda maneira de criar um Student, além de Student.new().

Você também pode chamar uma função estática em um objeto, como em ada.is_passing(50), mas o nome da classe deixa claro que nenhum objeto está envolvido.

challenge icon

Desafio

Fácil

Escreva o código de notas em duas classes.

Grader em grader.gd tem apenas funções estáticas:

  • letter(points) retorna "A" para 90 ou mais, "B" para 80 ou mais, "C" para 70 ou mais, "D" para 60 ou mais e "F" abaixo disso
  • is_passing(points) retorna true para 60 ou mais

Student em student.gd já tem suas propriedades e seu construtor. Complete:

  • a função estática from_line(line), que divide uma linha como Ada 91 no espaço e retorna um novo Student com esse nome e essa pontuação
  • o método report(), que retorna NAME: SCORE (LETTER), passed ou NAME: SCORE (LETTER), failed, usando as duas funções de Grader

O código fornecido lê quantos estudantes vêm a seguir, cria cada um com Student.from_line(), imprime seu relatório e, por fim, conta os estudantes aprovados. Para Ada 91, Bo 42 e Cy 75, ele imprime:

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

Seu código deve ficar em grader.gd e student.gd. main.gd contém o código de entrada/saída fornecido e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online