Menu
CoddyTech

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 mengembalikan true jika 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 mengembalikan false saat 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 Bo

Simpan 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.

challenge icon

Tantangan

Mudah

Tulis class Bookshelf di bookshelf.gd. Class ini menyimpan judul di _titles dan menampung paling banyak _capacity buku:

  • add(title) menambahkan judul dan mengembalikan true, atau mengembalikan false tanpa menambahkan judul jika rak penuh atau sudah memiliki judul tersebut.
  • size() mengembalikan jumlah buku, sedangkan has(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 perulangan for menelusuri 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: Ulysses

Tulis 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))
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online