Nie rozumiem uzasadnienia decyzji tej części Lua. Dlaczego indeksowanie zaczyna się od 1? Przeczytałem (jak wielu innych) ten wspaniały artykuł . Wydaje mi się, że jest to dziwny zakątek języka, którego bardzo przyjemnie się uczy i programuje. Nie zrozum mnie źle, Lua jest po prostu świetna, ale gdzieś musi być wyjaśnienie. Większość tego, co znalazłem (w sieci), to po prostu stwierdzenie, że indeks zaczyna się od 1. Kropka.
Byłoby bardzo interesujące przeczytać, co powiedzieli na ten temat jego projektanci.
Zauważ, że jestem „bardzo” początkującym graczem w Lua, mam nadzieję, że nie brakuje mi czegoś oczywistego w kwestii stołów.
Odpowiedzi:
Lua wywodzi się z języka Sol, języka przeznaczonego dla inżynierów naftowych bez formalnego szkolenia w zakresie programowania komputerowego. Ludzie, którzy nie są wyszkoleni w informatyce, uważają, że rozpoczęcie liczenia od zera jest cholernie dziwne. Przyjmując indeksowanie tablic i ciągów w oparciu o 1, projektanci Lua uniknęli zakłócenia oczekiwań swoich pierwszych klientów i sponsorów.
Chociaż na początku też uważałem je za dziwne, nauczyłem się kochać tablice oparte na 0. Ale radzę sobie dobrze z tablicami Lua opartymi na 1, zwłaszcza używając ogólnej
for
pętli Lua iipairs
operatora - zwykle mogę uniknąć martwienia się o to, jak tablice są indeksowane.źródło
< length
jest znacznie wygodniejszy i łatwiejszy do odczytania w "dziwnych językach opartych na 0". Wyznaję, kiedy widzę pętlę iterującą od 1, od razu zakładam, że zaczyna się od 2. elementu: SW pierwszej dyskusji na temat tabel w Programming in Lua wspominają o:
Później, w rozdziale o strukturach danych, ponownie mówią prawie to samo: że wbudowane funkcje Lua zakładają indeksowanie oparte na 1.
W każdym razie istnieje kilka udogodnień związanych z indeksowaniem opartym na 1. Mianowicie,
#
(długość), operator:t[#t]
dostęp ostatnie (numeryczna) indeks do tabeli it[#t+1]
dostęp 1 obok ostatniego indeksu. Dla kogoś, kto nie był jeszcze narażony na indeksowanie oparte na zerach,#t+1
byłoby bardziej intuicyjne przejście poza koniec listy. Istnieje równieżfor i = 1,#t
konstrukcja Lua , która, jak sądzę, należy do tej samej kategorii co poprzedni punkt, że „1 do długości” może być bardziej sensowne niż indeksowanie „0 do długości minus 1”.Ale jeśli nie możesz przełamać mentalności indeksowania opartego na 0, to indeksowanie oparte na Lua 1 może z pewnością być większą przeszkodą. Ostatecznie autorzy chcieli czegoś, co zadziała dla nich ; i przyznaję, że nie wiem, jaki był ich pierwotny cel, ale prawdopodobnie od tego czasu się to zmieniło.
źródło
Rozumiem, że dzieje się tak tylko dlatego, że autorzy myśleli, że byłby to dobry sposób, a po tym, jak udostępnili język opinii publicznej, decyzja ta znacznie się zwapniała. (Podejrzewam, że byłoby piekło do zapłacenia, gdyby dziś to zmienili!) Nigdy nie widziałem innego uzasadnienia poza tym.
źródło
array[0] == array + 0;
, a liczenie oparte na 1 jest bardziej naturalne, gdy tablica jest w rzeczywistości tablicą mieszającą.Być może jest to mniej znacząca kwestia, ale o której jeszcze nie słyszałem: jest lepsza symetria w fakcie, że pierwszy i ostatni znak w ciągu mają odpowiednio 1 i -1 zamiast 0 i -1.
źródło
Biblioteki Lua wolą używać indeksów zaczynających się od 1. Możesz jednak użyć dowolnego indeksu. Możesz użyć 0, możesz użyć 1, możesz użyć -5. Jest to nawet w ich instrukcji, którą można znaleźć pod adresem ( https://www.lua.org/pil/11.1.html ).
W rzeczywistości, coś fajnego jest to, że wewnętrzne biblioteki Lua będą traktować NIEKTÓRE z pozytywnych zer jako 1. Po prostu zachowaj ostrożność podczas korzystania z ipairs.
Więc to:
("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
będzie prawdziwe.źródło
({'a', 'b'})[1]
ocenić, aby tego'b'
nie robić'a'
? Wydaje mi się, że to jest wbudowane.({[0] = 'a', 'b'})[1]
Prawdziwym powodem jest to, że język jest implementacją definicji zawartej w prawie portugalskim, a głównym ośrodkiem rozwoju znajdował się w Brazylii, a oni wolą unikać stosowania zera lub pustego lub nic jako indeksu lub indeksu. Jednak język zezwala na użycie indeksu początkowego innego niż 1 w funkcji tworzenia tabeli w niektórych wersjach.
źródło
table [0] ZAWSZE zwróci nil (null), chyba że sam przypiszesz do niej wartość table [0] = 'jakaś wartość', a tabela [0] zwróci 'jakąś wartość', którą TY przypisałeś.
Oto przykład:
źródło
Dla każdego ma sens, że jeśli plik
W tej chwili
table
jest pusty. Więc kiedyTabela zawiera coś, więc zawiera indeks 1,
table
jeśli wiesz, o co mi chodzi.Miałem na myśli to, że tabela [0] istnieje, a jej tabela = {}, która jest pusta, teraz programista nie nazwie pustej tabeli, ustawia je, a następnie wypełnia, bezcelowe będzie znalezienie pustej tabeli table za każdym razem, gdy chcesz go wywołać, więc łatwiej jest po prostu utworzyć pustą tabelę.
Mój angielski nie poprawi się i to moja najlepsza gramatyka. Jeśli ci się to nie podoba, możesz nie czytać dalej, ale dawanie -rep komuś, kto próbuje pomóc, sprawia, że ludzie w ogóle nie chcą pomagać, szczególnie w przypadku czegoś takiego jak gramatyka. Jestem człowiekiem liczb i zmiennych, a nie gramatyki. Przepraszam.
źródło
0
jako jedynego elementu, nadal nie jest pusta. W rzeczywistości lua to obsługuje, po prostu nie jest to domyślna konwencja.