Mengapa lua array (tabel) dimulai dari 1, bukan 0?

125

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.

AraK
sumber
23
Cakupan default juga global. Dua kesalahan terbesar dari Lua.
Yann Ramin
37
Saya tidak akan menyebut mulai dari 1 kesalahan fitur. Ini sebenarnya lebih masuk akal - programmer sangat terlatih untuk berpikir dalam hal pengindeksan berbasis 0 dari bahasa lain yang tidak kami sukai. Kita juga dilatih untuk berpikir 5/2 = 2. Itu tidak membuatnya menjadi benar.
BlueRaja - Danny Pflughoeft
54
@ BlueRaja-DannyPflughoeft: tidak. Pengindeksan nol lebih masuk akal - manusia sangat terlatih dalam mulai menghitung dengan 1 sehingga bahasa yang dimulai dengan 0 pada awalnya membingungkan. Tapi saya ingin merujuk Anda ke Edsger Dijkstra di sini: cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
orlp
11
@ nightcracker: Saat Anda menghitung apel di atas meja, Anda menghitung apel pertama sebagai "satu", yang kedua sebagai "dua", dll. Tidak ada yang menghitung apel pertama sebagai "nol" dan kemudian menambahkan satu di akhir; menghitung dari nol secara sederhana, tidak dapat disangkal, berlawanan dengan intuisi. Ya, saya menyadari begitulah cara kerja pengindeksan secara internal, tetapi itulah mengapa kami menyebutnya abstraksi.
BlueRaja - Danny Pflughoeft
9
Saya tidak pernah mengerti semua cinta terhadap pengindeksan berbasis 0. Ini bagus untuk offset (berapa banyak item yang dilewati dari awal?) Dan selanjutnya (0 ≤ x <n), tetapi terlihat salah untuk hal-hal dasar (elemen kedua disebut satu? Elemen kesepuluh sesuai dengan indeks sembilan? WAT?) . Bahkan pemrogram menghitung dari 1 ketika mereka mencoba menemukan baris yang dilaporkan oleh kompiler ...
marcus

Jawaban:

143

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 forloop generik Lua dan ipairsoperatornya — saya biasanya dapat menghindari kekhawatiran tentang bagaimana array diindeks.

Norman Ramsey
sumber
7
Ini hanya alasan pemasaran historis. Tidak ada alasan rasional, apalagi saat ini. Dan tampaknya Anda mencoba menghindari pengindeksan berbasis 1 daripada menggunakannya :)
eonil
27
@Eonil sebenarnya menghindari pengindeksan eksplisit mengurangi kesalahan pengindeksan.
Dan D.
8
@Eonil alasan bersejarah biasanya yang relevan. Anda mulai dengan sesuatu, dan kemudian Anda tidak akan pernah bisa mengubahnya, karena itu akan merusak semua kode yang ada. Sangat buruk untuk pengindeksan 0 vs. 1, karena cara pemecahannya cukup halus.
CodesInChaos
5
Perbedaannya adalah antara berpindah dari 1 ke Panjang dan dari 0 ke panjang -1, tetapi dalam loop for, < lengthini 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: S
Felype
45

Dalam Pemrograman dalam diskusi pertama Lua tentang tabel, mereka menyebutkan:

Karena Anda dapat mengindeks tabel dengan nilai apa pun, Anda dapat memulai indeks array dengan nomor apa pun yang Anda sukai. Akan tetapi, adalah kebiasaan di Lua untuk memulai array dengan 1 (dan bukan dengan 0, seperti pada C) dan beberapa fasilitas tetap menggunakan konvensi ini.

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, dan t[#t+1]mengakses 1 setelah indeks terakhir. Untuk seseorang yang belum pernah terkena pengindeksan berbasis 0, #t+1akan lebih intuitif untuk melewati akhir daftar. Ada juga for i = 1,#tkonstruksi 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.

Mark Rushakoff
sumber
16

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.

dasbor-tom-bang
sumber
6
Pembenaran yang mungkin: C hanya melakukannya karena array pada dasarnya hanyalah sebuah penunjuk dan array[0] == array + 0;, dan penghitungan berbasis 1 lebih natural jika array benar-benar tabel hash.
Hakim Maygarden
19
Indeks Lua sebenarnya adalah indeks. Di C ketika Anda mengatakan indeks yang Anda maksud adalah offset.
Alex
8

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.

VXZ
sumber
8
Meskipun ini bagus, itu bukan alasan untuk memulai pada 1.
Jika
3

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.

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end
pengguna2262111
sumber
Apakah ada cara untuk membuat ({'a', 'b'})[1]evaluasi menjadi 'b'tidak 'a'? Sepertinya itu tertanam dalam diri saya.
remram
1
({[0] = 'a', 'b'})[1]
pengguna2262111
0

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.

Pengembang
sumber
5
Bahkan jika ini benar, itu sama sekali tidak relevan dengan bagaimana Lua dirancang.
lhf
-1

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:

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))
BladeMight
sumber
-11

Masuk akal bagi setiap orang, bahwa jika a

table = {}

Saat ini, tablekosong. Jadi ketika

table == {something}

Tabel berisi sesuatu jadi isinya adalah indeks 1 tablejika 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.

Wesker
sumber
4
Saya tidak mendapatkan konsep tabel yang dinilai 0. Sebuah tabel bisa memiliki panjang 0. Tapi itu tidak tergantung pada pilihan indeks pertama. Saya tidak peduli dengan kesalahan tata bahasa kecil, tetapi saya sama sekali tidak mengerti maksud dari jawaban Anda, itulah sebabnya saya menurunkan suara.
CodesInChaos
thats what i ment, a table cant hold with a 0 index or value, because we use it as a empty table <, <when ​​you have something this, this something represent from 1, "n" so when you have nothing, your empty tentang sesuatu, yang membawa kita ke cero, tetapi cero dosnt menghitung, lua itu bahasa yang praktis, Anda tidak pergi keluar dan memberi tahu teman Anda, Anda tahu apa yang saya punya 0 lagu dari artis itu, apakah Anda memiliki beberapa, atau Anda jangan. titik mejanya = {} itu adalah meja kosong
Wesker
5
Larik yang menggunakan indeks 0sebagai satu-satunya elemen tetap tidak kosong. Nyatanya lua mendukung ini, hanya saja bukan konvensi default.
CodesInChaos
yup saya setuju dengan Anda, pada beberapa bahasa lain, tetapi tidak lua, lua index 0 dosnt ada, jadi kita bisa membayangkannya seperti kosong = 0, atau begitulah cara saya membayangkannya, bahkan ketika Anda dapat memaksa indeks menjadi 0, Itu tidak akan berfungsi dengan nilai tabel #tabel tidak akan membaca indeks 0, jadi jawaban saya masih bahwa lua pada dasarnya dibuat seperti acara biasa, sekarang jika mereka bermaksud ini atau tidak itu tidak terlalu relevan Anda tidak akan menulis kode lubang lagi, dan kita tidak bisa berbuat apa-apa: /, saya masih percaya bahwa adil untuk mengatakan bahwa dalam lua tabel kosong memiliki indeks 0
Wesker