Ö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 varsatruedö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ığındafalsedö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 BoKonumu 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.
Görev
Kolaybookshelf.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 vetruedöndürür; raf doluysa veya başlık zaten rafta varsa ekleme yapmadanfalsedö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(), birfordö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: UlyssesKodunu 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))
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi