Lua dizileri (tabloları) neden 0 yerine 1'den başlıyor?


125

Lua'nın bu kısmının kararının arkasındaki mantığı anlamıyorum. İndeksleme neden 1'den başlıyor? Bu harika makaleyi (diğerlerinin yaptığı gibi) okudum . Bana öğrenmesi ve programlaması çok keyifli olan bir dilin garip bir köşesi gibi görünüyor. Beni yanlış anlamayın, Lua harika ama bir yerde bir açıklama olmalı. Bulduğum şeylerin çoğu (web'de) sadece dizinin 1'den başladığını söylüyor. Tam durak.

Tasarımcılarının konu hakkında söylediklerini okumak çok ilginç olurdu.

Lua'da "çok" acemi olduğuma dikkat edin, umarım tablolarla ilgili bariz bir şeyi kaçırmıyorumdur.


23
Varsayılan kapsam da globaldir. Lua'nın en büyük iki yanlışlığı.
Yann Ramin

37
1'den başlamak bir yanlışlık demezdim. Aslında daha mantıklı - programcılar, beğenmediğimiz diğer dillerden 0 tabanlı indeksleme açısından düşünmek için çok iyi eğitilmişler. Ayrıca 5/2 = 2'yi düşünmek için eğitildik. Bu onu doğru yapmaz.
BlueRaja - Dany Pflughoeft

54
@ BlueRaja-DannyPflughoeft: hayır. Sıfır indeksleme daha mantıklıdır - insanlar 1 ile saymaya başlamak için o kadar iyi eğitilmiştir ki, 0 ile başlayan diller başlangıçta kafa karıştırıcıdır. Ama sizi burada Edsger
orlp

11
@nightcracker: Bir masada elmaları saydığınızda, ilkini "bir", ikincisini "iki" olarak sayarsınız. Kimse ilkini "sıfır" olarak saymaz ve sonra sonuna bir tane ekler; sıfırdan saymak basitçe, tartışmasız bir şekilde sezgiseldir. Evet, indekslemenin dahili olarak nasıl çalıştığını anlıyorum, ama bu yüzden buna soyutlama diyoruz.
BlueRaja - Danny Pflughoeft

9
0 tabanlı indekslemeye olan sevgiyi hiç anlamadım. Ofsetler (başlangıçtan itibaren kaç öğe atlanacak?) Ve alt diziler (0 ≤ x <n) için güzel, ancak temel şeyler için yanlış görünüyor (ikinci öğeye bir mi? Onuncu öğe indeks dokuza karşılık gelir? WAT?) . Programcılar bile derleyici tarafından bildirilen bir satırı bulmaya çalıştıklarında 1'den
sayıyorlar

Yanıtlar:


143

Lua, bilgisayar programlama konusunda resmi bir eğitim almamış petrol mühendisleri için tasarlanmış bir dil olan Sol'dan gelmektedir. Bilgi işlem konusunda eğitim almamış insanlar, sıfırdan saymaya başlamanın çok garip olduğunu düşünüyor. Lua tasarımcıları, 1 tabanlı dizi ve dizi indekslemeyi benimseyerek, ilk müşterilerinin ve sponsorlarının beklentilerini karıştırmaktan kaçındı.

Başlangıçta ben de onları tuhaf bulsam da, 0 tabanlı dizileri sevmeyi öğrendim. Ama Lua'nın 1 tabanlı dizileriyle, özellikle Lua'nın jenerik fordöngüsünü ve ipairsişleci kullanarak iyi geçiniyorum — genellikle dizilerin nasıl indekslendiği konusunda endişelenmekten kaçınabilirim.


7
Bu sadece tarihsel bir pazarlama nedenidir. Özellikle şu an için mantıklı bir neden yok. Görünüşe göre onu kullanmak yerine 1 tabanlı indekslemeden kaçınmaya çalışıyorsunuz :)
eonil

27
@Eonil aslında açık indekslemeden kaçınmak indeksleme hatalarını azaltır.
Dan D.

8
@Eonil'in tarihsel nedenleri genellikle alakalı olanlardır. Bir şeyle başlarsınız ve sonra onu asla değiştiremezsiniz, çünkü mevcut tüm kodu kırar. 0'a 1 indeksleme için özellikle kötü, çünkü kırılma şekli oldukça ince.
CodesInChaos

5
Fark, 1'den Uzunluk'a ve 0'dan -1 uzunluğuna gitmek arasındadır, ancak bir for döngüsünde < length"tuhaf 0 tabanlı dillerde" çok daha kullanışlı ve okunması daha kolaydır. 1'den yinelenen bir döngü gördüğümde itiraf ediyorum, hemen 2. elemandan başladığını varsayıyorum: S
Felype

45

In Lua içinde Programlama tabloların ilk tartışma, bunlar söz:

Bir tabloyu herhangi bir değerle indeksleyebileceğiniz için, bir dizinin indekslerine sizi memnun edecek herhangi bir sayı ile başlayabilirsiniz. Bununla birlikte, Lua'da dizileri 1 ile başlatmak gelenekseldir (C'deki gibi 0 ile değil) ve birkaç tesis bu sözleşmeye bağlıdır.

Daha sonra, veri yapıları ile ilgili bölümde, neredeyse aynı şeyi tekrar söylüyorlar: Lua'nın yerleşik tesisleri 1 tabanlı indekslemeyi varsayıyor.

Her neyse, 1 tabanlı indekslemeyi kullanmanın birkaç kolaylığı var . Yani #(uzunluk) operatörü: t[#t]tablonun son (sayısal) dizinine t[#t+1]erişir ve son dizini geçerek 1'e erişir . Henüz 0 tabanlı indekslemeye maruz kalmamış biri için, #t+1bir listenin sonunu geçmek daha sezgisel olacaktır. Bir de Lua'nın for i = 1,#tyapısı var, bir önceki nokta ile aynı kategoriye girdiğine inanıyorum ki "1'den uzunluk", "0'dan uzunluk eksi 1'e" indekslemekten daha mantıklı olabilir.

Ancak, 0 tabanlı indeksleme zihniyetini kıramazsanız, Lua'nın 1 tabanlı indekslemesi kesinlikle bir engel olabilir. Nihayetinde yazarlar kendileri için çalışan bir şey istediler ; ve orijinal hedeflerinin ne olduğunu bilmediğimi itiraf edeceğim , ama muhtemelen o zamandan beri değişti.


16

Anladığım kadarıyla, sadece yazarlar bunu yapmanın iyi bir yolu olacağını düşündükleri ve dili halka duyurduktan sonra bu karar önemli ölçüde kireçlendi. (Bugün değiştirirlerse cehennem ödeyeceklerinden şüpheleniyorum!) Bunun ötesinde belirli bir gerekçe görmedim.


6
Muhtemel gerekçelendirme: C bunu yalnızca bir dizi temelde sadece bir işaretçi olduğu ve array[0] == array + 0;dizi gerçekten bir karma tablo olduğunda 1 tabanlı sayma daha doğal olduğu için yaptı.
Yargıç Maygarden

19
Lua endeksleri aslında endekslerdir. C'de indeks derken gerçekten kastettiğin şey bir farktır.
Alex

8

Belki daha az önemli bir nokta, ancak henüz bahsetmediğim bir nokta: Bir dizedeki ilk ve son karakterlerin 0 ve -1 yerine sırasıyla 1 ve -1 olması daha iyi bir simetri var.


8
Bu güzel olsa da , 1'den başlamak için bir sebep değildi .
lhf

3

Lua kütüphaneleri 1'den başlayan indisleri kullanmayı tercih eder. Ancak istediğiniz herhangi bir indeksi kullanabilirsiniz. 0, 1, -5 kullanabilirsiniz. Hatta ( https://www.lua.org/pil/11.1.html ) adresinde bulunan kılavuzlarında bile bulunmaktadır .

Aslında, burada harika bir şey, dahili lua kitaplıklarının BAZI geçen 0'ları 1'ler olarak ele almasıdır. Sadece ipairs kullanırken dikkatli olun.
Böylece: ("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"doğru olacak.

 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

Marka için bir yol var mı ({'a', 'b'})[1]hiç değerlendirmek 'b'değil 'a'gerçi? Bu bana yerleşik görünüyor.
remram

1
({[0] = 'a', 'b'})[1]
user2262111

0

Gerçek neden, dilin Portekiz yasasındaki tanımın bir uygulaması olması ve ana kalkınma merkezinin Brezilya'da olması ve tercihlerinin, endeks veya alt simge olarak sıfır veya boş ya da hiç kullanımından kaçınmak olmasıdır. Bununla birlikte, dil, bazı sürümlerde işlev oluşturan bir tabloda 1'den farklı bir başlangıç ​​dizininin kullanılmasına izin verir.


5
Bu doğru olsa bile, Lua'nın nasıl tasarlandığıyla hiç alakalı değildir.
lhf

-1

tablo [0] HER ZAMAN nil (null) döndürür, KENDİNİZE bir değer atamazsanız tablo [0] = 'bir değer' ve sonra tablo [0], sizin atadığınız 'bir değer' döndürür.

İşte bir örnek:

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]))

-11

Herkes için mantıklı, eğer bir

table = {}

Şu anda tableboş. Öyleyse ne zaman

table == {something}

Tabloda bir şey var, bu yüzden ne tabledemek istediğimi anlıyorsanız , içerdiği dizin 1'dir .

Demek istediğim, o tablonun [0] var ve tablası = {}, ki boş, şimdi bir programcı boş bir tablo çağırmayacak, onları ayarlayacak ve sonra dolduracak, boş bir tablo bulmanın faydası olmayacak tabloyu her çağırmak istediğinizde, boş bir tablo oluşturmak daha basittir.

İngilizcem daha iyi olmayacak ve bu benim en iyi gramerim. Hoşunuza gitmiyorsa, okumaya devam etmekte özgürsünüz, ama yardım etmeye çalışan biri için -replik yapmak, insanların, özellikle de gramer gibi bir konuda hiç yardım istememesine neden olur. Ben gramer değil, sayılar ve sayılar adamıyım. Afedersiniz.


4
0 değerli bir tablo kavramını anlamıyorum. Bir tablonun uzunluğu 0 olabilir. Ancak bu, ilk indeks seçiminden bağımsızdır. Küçük gramer hataları umurumda değil, ama cevabınızın amacını anlamıyorum, bu yüzden oy vermedim.
CodesInChaos

bu, bir tablo 0 indeksi veya değeri ile tutulamaz, çünkü onu boş bir tablo olarak kullanırız <, <bir şeye sahip olduğunuzda, 1'den temsil edilen bir şey, "n" yani hiçbir şeyiniz olmadığında, boş bizi bir cero'ya götüren bir şey, ama cero dosnt sayısı, lua bu pratik gelen bir lenguage, dışarı çıkıp arkadaşlarınıza o sanatçıların 0 şarkısına sahip olduğumu bildiğinizi söyleyin, eger sende biraz olsun ya da do not. masası = {} bu boş bir masayı işaret ediyor
Wesker

5
Dizini 0tek öğe olarak kullanan bir dizi hala boş değil. Aslında lua bunu destekler, bu sadece varsayılan kural değildir.
CodesInChaos

evet, diğer dillerde sana katılıyorum, ama lua, lua indeksi 0 yok, bu yüzden boş = 0 gibi hayal edebiliriz, ya da bu şekilde resmediyorum, dizini 0 olmaya zorlasanız bile, tablo değerleri ile çalışmayacak #table 0 indeksini okumayacak, bu yüzden cevabım hala normal bir olay gibi yapıldığını söylüyor, şimdi bunu istiyorlarsa ya da gerçekten alakalı değilse delik kodunu tekrar yazmayacaksınız ve bu konuda hiçbir şey yapamayız: /, hala lua'da boş bir masanın 0 endeksi olduğunu söylemenin adil olduğuna inanıyorum
Wesker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.