Iterator Kustom
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 33 dari 65.
Python membuat sebuah class berperilaku seperti list dengan method ajaib seperti __len__, __getitem__, __contains__ dan __iter__. Godot memiliki method virtual hanya untuk salah satu tugas ini, yaitu perulangan for. Tiga method membuat for item in my_object: berfungsi:
_iter_init(iter)dijalankan sekali, sebelum putaran pertama. Method ini menetapkan posisi awal dan mengembalikantruejika ada elemen pertama._iter_get(position)mengembalikan elemen pada posisi saat ini, dan variabel perulangan mendapatkan nilai tersebut._iter_next(iter)dijalankan sebelum setiap putaran berikutnya. Method ini berpindah ke posisi berikutnya dan mengembalikanfalsesaat tidak ada lagi elemen, sehingga perulangan berakhir.
# 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 adalah array dengan satu slot yang dibuat Godot untuk setiap perulangan. iter[0] menyimpan posisi perulangan tersebut, dan Godot meneruskan nilainya ke _iter_get(). Kini, Team dapat digunakan dalam for loop:
var team := Team.new()
team.add("Ada")
team.add("Bo")
for member in team:
print(member) # Ada, lalu BoSimpan posisi di iter[0], bukan di variabel anggota seperti _position. Setiap perulangan memiliki iter sendiri, jadi dua perulangan pada tim yang sama, bahkan jika salah satunya berada di dalam yang lain, tidak saling mengganggu. Dengan variabel anggota, perulangan bagian dalam akan menggeser posisi perulangan bagian luar.
Operasi list lainnya tidak memiliki method virtual: len(team) dan team[0] menghasilkan error. Tulis method biasa dengan nama seperti milik Array, misalnya size(), get_at(index), dan has(member). Jangan menguji keanggotaan dengan in: "Ada" in team memeriksa apakah Team memiliki property atau method bernama Ada, jadi hasilnya false.
Tantangan
MudahTulis class Bookshelf di bookshelf.gd. Class ini menyimpan judul di _titles dan menampung paling banyak _capacity buku:
add(title)menambahkan judul dan mengembalikantrue, atau mengembalikanfalsetanpa menambahkan judul jika rak penuh atau sudah memiliki judul tersebut.size()mengembalikan jumlah buku, sedangkanhas(title)mengembalikan apakah judul tersebut ada di rak.get_at(index)mengembalikan judul pada indeks tersebut, atau string kosong jika indeks berada di luar rak._iter_init(),_iter_next(), dan_iter_get()memungkinkan perulanganformenelusuri judul sesuai urutan penambahannya.
Kode yang disediakan membaca kapasitas, jumlah judul, dan satu judul per baris, lalu melaporkan judul yang tidak dapat ditambahkan. Kode tersebut mencetak jumlah buku, menampilkannya dengan perulangan for pada rak, lalu membaca satu judul lagi dan mencetak apakah rak memilikinya, serta buku terakhir. Untuk kapasitas 3, judul Dune, Emma, Dune, Ulysses, Hamlet, dan pencarian Emma, kode tersebut mencetak:
Could not add: Dune
Could not add: Hamlet
Books: 3
1. Dune
2. Emma
3. Ulysses
Has Emma: true
Last: UlyssesTulis kodemu di bookshelf.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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))
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online