Menu
CoddyTech

Özel Yineleyiciler

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 33 / 65.

Python, __len__, __getitem__, __contains__ ve __iter__ gibi sihirli yöntemlerle bir sınıfın liste gibi davranmasını sağlar. Godot'ta bu işlerden yalnızca biri için, for döngüsü için sanal yöntemler vardır. Üç yöntem, for item in my_object: ifadesinin çalışmasını sağlar:

  • _iter_init(iter) ilk yinelemeden önce bir kez çalışır. Başlangıç konumunu ayarlar ve ilk öğe varsa true döndürür.
  • _iter_get(position) geçerli konumdaki öğeyi döndürür ve döngü değişkeni bu değeri alır.
  • _iter_next(iter) sonraki her yinelemeden önce çalışır. Bir sonraki konuma geçer ve başka öğe kalmadığında false döndürür; bu da döngüyü sonlandırır.
# team.gd
class_name Team
extends RefCounted

var _members: Array[String] = []

func add(member: String) -> void:
	_members.append(member)

func _iter_init(iter: Array) -> bool:
	iter[0] = 0
	return iter[0] < _members.size()

func _iter_next(iter: Array) -> bool:
	iter[0] += 1
	return iter[0] < _members.size()

func _iter_get(position):
	return _members[position]

iter, Godot'un her döngü için oluşturduğu tek yuvalı bir Array'dir. iter[0], o döngünün konumunu tutar ve Godot bu değerini _iter_get()'e iletir. Artık bir Team, for döngüsünde çalışır:

var team := Team.new()
team.add("Ada")
team.add("Bo")
for member in team:
	print(member) # Ada, ardından Bo

Konumu iter[0] içinde tutun, _position gibi bir üye değişkende değil. Her döngü kendi iter değerini alır; bu nedenle aynı takım üzerinde çalışan iki döngü, iç içe olsalar bile birbirini etkilemez. Bir üye değişkeni kullanılsaydı, iç döngü dış döngünün konumunu değiştirirdi.

Diğer liste işlemlerinin sanal yöntemi yoktur: len(team) ve team[0] hata verir. size(), get_at(index) ve has(member) gibi, Array'inkilere benzer adlara sahip normal yöntemler yazın. Üyeliği in ile test etmeyin: "Ada" in team, Team'in Ada adlı bir özelliği veya yöntemi olup olmadığını kontrol eder; bu nedenle sonuç false olur.

challenge icon

Görev

Kolay

bookshelf.gd dosyasında Bookshelf sınıfını yaz. Sınıf, başlıkları _titles içinde tutar ve en fazla _capacity kitap alır:

  • add(title) başlığı ekler ve true döndürür; raf doluysa veya başlık zaten rafta varsa ekleme yapmadan false döndürür.
  • size() kitap sayısını, has(title) ise başlığın rafta olup olmadığını döndürür.
  • get_at(index) belirtilen indeksteki başlığı, indeks rafın sınırları dışındaysa boş bir dize döndürür.
  • _iter_init(), _iter_next() ve _iter_get(), bir for döngüsünün başlıkları eklenme sırasına göre dolaşmasını sağlar.

Sağlanan kod kapasiteyi, başlık sayısını ve her satırda bir başlığı okur, ekleyemediği başlıkları bildirir. Kitap sayısını yazdırır, raftaki kitapları bir for döngüsüyle listeler, ardından bir başlık daha okur ve rafın bu başlığı içerip içermediğini ve son kitabı yazdırır. Kapasite 3, başlıklar Dune, Emma, Dune, Ulysses, Hamlet ve arama Emma olduğunda şu çıktıyı verir:

Could not add: Dune
Could not add: Hamlet
Books: 3
1. Dune
2. Emma
3. Ulysses
Has Emma: true
Last: Ulysses

Kodunu bookshelf.gd dosyasına yaz. main.gd sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
	var shelf := Bookshelf.new(int(OS.read_string_from_stdin()))
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var title := OS.read_string_from_stdin()
		if not shelf.add(title):
			print("Could not add: " + title)
	print("Books: %d" % shelf.size())
	var number := 1
	for title in shelf:
		print("%d. %s" % [number, title])
		number += 1
	var query := OS.read_string_from_stdin()
	print("Has %s: %s" % [query, shelf.has(query)])
	print("Last: " + shelf.get_at(shelf.size() - 1))
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi