Mengubah isi di tempatnya
Kadang yang diminta bukan array baru, melainkan array yang sama dengan isi yang sudah berubah.
Sebaiknya baca lebih dulu: Menunjuk elemen lewat nomornya, Menghitung sampai berhenti.
Menimpa, bukan memindahkan
Pelajaran sebelumnya membangun array baru dan meninggalkan yang lama utuh. Di sini sebaliknya: arraynya sendiri yang berubah. Perbedaan keduanya bukan gaya penulisan, melainkan jawaban atas satu pertanyaan: apakah pemanggil masih membutuhkan bentuk aslinya.
IngatMembuat array baru aman tetapi memakan memori dua kali. Mengubah di tempat hemat tetapi menghapus bentuk aslinya untuk selamanya.
Kenapa loop per elemen tidak cukup
Per elemen, tanpa indeks
FOR EACH angka IN numbers SET angka = angka * 2 END
Berbasis indeks
SET i = 0 WHILE i < LENGTH(numbers) SET numbers[i] = numbers[i] * 2 SET i = i + 1 END
Kolom kiri tidak mengubah apa pun. Variabel angka adalah salinan nilai elemennya, bukan elemennya sendiri; menimpanya hanya menimpa salinan yang dibuang pada putaran berikutnya. Untuk menulis kembali ke arraynya, kode wajib tahu POSISI elemen itu, dan posisi hanya tersedia bila loopnya berbasis indeks.
Ini kesalahan yang sangat halus, sebab kolom kiri tidak melapor apa pun. Tidak ada galat, tidak ada peringatan, dan arraynya keluar apa adanya seperti tidak ada satu baris pun yang dijalankan. Yang membedakan bacaan bahwa angka hanyalah nama untuk salinan.
Membaca dan menulis posisi yang sama
SET i = 0 WHILE i < LENGTH(numbers) SET numbers[i] = numbers[i] * 2 SET i = i + 1 END
Indeks dimulai dari nol.
Perhatikan langkah pertama dengan teliti. Setelah indeks nol ditulis, arraynya sudah menjadi [2, 2, 3], dan untuk sesaat ada dua angka dua yang artinya berbeda: yang pertama sudah digandakan, yang kedua belum. Keadaan setengah jadi seperti itu selalu ada pada perubahan di tempat, dan itu sebabnya mengubah di tempat menuntut ketelitian lebih.
Nilai yang tidak berubah walau digandakan
- Bilangan negatif tetap digandakan, menjadi lebih negatif. Negatif tiga menjadi negatif enam.
- Nol dikali dua tetap nol. Elemennya memang ditulis ulang, hanya nilainya kebetulan sama.
- Array kosong tidak menjalankan satu putaran pun, sebab kondisinya sudah salah pada pemeriksaan pertama.
Butir kedua pantas diperhatikan. Nol yang tetap nol bukan tanda kodenya tidak berjalan; penugasannya benar benar terjadi, hanya hasilnya sama dengan sebelumnya. Membedakan tidak berubah dari tidak dijalankan adalah kebiasaan yang sama yang dilatih pada klausa penjaga di pelajaran 2.3.
Periksa pemahaman
numbers berisi [-3]. Apa isinya sesudah dijalankan, dan berapa kali penugasan indeks terjadi?
Ringkasan
- Mengubah di tempat menuntut posisi elemennya, jadi loopnya berbasis indeks.
- Loop per elemen hanya memberi salinan nilai; menimpanya tidak mengubah arraynya dan tidak melapor apa pun.
- Membaca dan menulis indeks yang sama pada satu baris adalah pola yang sama dengan akumulator.
- Selama loop berjalan, arraynya berada dalam keadaan setengah jadi.
- Nilai yang kebetulan tidak berubah bukan tanda penugasannya tidak terjadi.
- Pilih membangun baru bila pemanggil masih butuh bentuk aslinya; pilih di tempat bila tidak.