Saya tidak mengerti alasan di balik keputusan bagian Lua ini. Mengapa pengindeksan dimulai dari 1? Saya telah membaca (seperti yang dilakukan banyak orang) makalah yang luar biasa ini . Bagi saya, sudut aneh dari bahasa yang sangat menyenangkan untuk dipelajari dan diprogram. Jangan salah paham, Lua memang hebat tapi pasti ada penjelasannya entah di mana. Sebagian besar yang saya temukan (di web) hanya mengatakan indeks dimulai pada 1. Berhenti penuh.
Akan sangat menarik untuk membaca apa yang dikatakan perancangnya tentang subjek tersebut.
Perhatikan bahwa saya "sangat" pemula di Lua, saya harap saya tidak melewatkan sesuatu yang jelas tentang tabel.
Jawaban:
Lua diturunkan dari Sol, bahasa yang dirancang untuk insinyur perminyakan tanpa pelatihan formal dalam pemrograman komputer. Orang yang tidak terlatih dalam komputasi merasa sangat aneh untuk mulai menghitung dari nol. Dengan mengadopsi array berbasis-1 dan pengindeksan string, para desainer Lua menghindari pengganggu harapan klien dan sponsor pertama mereka.
Meskipun saya juga menganggapnya aneh pada awalnya, saya telah belajar menyukai array berbasis 0. Tetapi saya berhasil dengan baik-baik saja dengan array berbasis-1 Lua, terutama dengan menggunakan
for
loop generik Lua danipairs
operatornya — saya biasanya dapat menghindari kekhawatiran tentang bagaimana array diindeks.sumber
< length
ini jauh lebih praktis dan lebih mudah dibaca pada "bahasa berbasis 0 yang aneh". Saya mengaku ketika saya melihat loop yang berulang dari 1, saya langsung menganggapnya dimulai dari elemen ke-2: SDalam Pemrograman dalam diskusi pertama Lua tentang tabel, mereka menyebutkan:
Kemudian, dalam bab tentang struktur data, mereka mengatakan hal yang hampir sama lagi: bahwa fasilitas bawaan Lua mengasumsikan pengindeksan berbasis-1.
Bagaimanapun, ada beberapa kemudahan untuk menggunakan pengindeksan berbasis 1. Yaitu,
#
operator (panjang):t[#t]
mengakses indeks (numerik) terakhir dari tabel, dant[#t+1]
mengakses 1 setelah indeks terakhir. Untuk seseorang yang belum pernah terkena pengindeksan berbasis 0,#t+1
akan lebih intuitif untuk melewati akhir daftar. Ada jugafor i = 1,#t
konstruksi Lua , yang saya percaya berada di bawah kategori yang sama dengan poin sebelumnya bahwa "1 untuk panjang" bisa lebih masuk akal daripada mengindeks "0 dengan panjang dikurangi 1".Tetapi, jika Anda tidak dapat mematahkan pola pikir pengindeksan berbasis 0, maka pengindeksan berbasis-1 Lua tentunya bisa menjadi lebih penghalang. Pada akhirnya, penulis menginginkan sesuatu yang berhasil untuk mereka ; dan saya akui saya tidak tahu apa tujuan awal mereka , tetapi mungkin berubah sejak saat itu.
sumber
Pemahaman saya adalah bahwa itu seperti itu hanya karena penulis berpikir itu akan menjadi cara yang baik untuk melakukannya, dan setelah mereka meluncurkan bahasanya ke publik, keputusan itu sangat diperhitungkan. (Saya curiga akan ada neraka yang harus dibayar jika mereka mengubahnya hari ini!) Saya belum pernah melihat pembenaran khusus di luar itu.
sumber
array[0] == array + 0;
, dan penghitungan berbasis 1 lebih natural jika array benar-benar tabel hash.Mungkin poin yang kurang signifikan, tetapi yang belum pernah saya dengar disebutkan: ada simetri yang lebih baik dalam kenyataan bahwa karakter pertama dan terakhir dalam sebuah string masing-masing berada pada 1 dan -1, bukan 0 dan -1.
sumber
Library Lua lebih suka menggunakan indeks yang dimulai dari 1. Namun, Anda dapat menggunakan indeks apa pun yang Anda inginkan. Anda dapat menggunakan 0, Anda dapat menggunakan 1, Anda dapat menggunakan -5. Itu bahkan ada dalam manual mereka, yang bisa ditemukan di ( https://www.lua.org/pil/11.1.html ).
Faktanya, sesuatu yang keren di sini adalah perpustakaan lua internal akan memperlakukan BEBERAPA lulus 0 sebagai 1. Berhati-hatilah saat menggunakan ipairs.
Sehingga:
("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
akan menjadi kenyataan.sumber
({'a', 'b'})[1]
evaluasi menjadi'b'
tidak'a'
? Sepertinya itu tertanam dalam diri saya.({[0] = 'a', 'b'})[1]
Alasan sebenarnya adalah bahwa bahasa tersebut merupakan implementasi dari definisi dalam undang-undang Portugal dan pusat pembangunan utama berada di Brasil dan preferensi mereka adalah untuk menghindari penggunaan nol atau kosong atau tidak sama sekali sebagai indeks atau subskrip. Namun bahasa mengizinkan penggunaan indeks awal selain 1 dalam tabel yang membuat fungsi di beberapa versi.
sumber
tabel [0] AKAN SELALU mengembalikan nihil (null), KECUALI jika Anda menetapkan nilai sendiri tabel [0] = 'beberapa nilai' dan kemudian tabel [0] akan mengembalikan 'beberapa nilai' yang ANDA tetapkan.
Berikut contohnya:
sumber
Masuk akal bagi setiap orang, bahwa jika a
Saat ini,
table
kosong. Jadi ketikaTabel berisi sesuatu jadi isinya adalah indeks 1
table
jika Anda tahu apa yang saya maksud.Yang saya maksud adalah tabel itu [0] ada, dan tabelnya = {}, yang kosong, sekarang programmer tidak akan memanggil tabel kosong, ia mengaturnya, dan kemudian mengisinya, tidak akan ada gunanya menemukan yang kosong tabel setiap kali Anda ingin memanggilnya, jadi lebih mudah untuk hanya membuat tabel kosong.
Bahasa Inggris saya tidak akan menjadi lebih baik dan itulah tata bahasa terbaik saya. Jika Anda tidak menyukainya, Anda bebas untuk tidak terus membacanya, tetapi memberi -rep untuk seseorang yang mencoba membantu membuat orang tidak ingin membantu sama sekali, terutama untuk sesuatu seperti tata bahasa. Saya seorang pria dengan angka dan vars, bukan tata bahasa. Maaf.
sumber
0
sebagai satu-satunya elemen tetap tidak kosong. Nyatanya lua mendukung ini, hanya saja bukan konvensi default.