Domanda

Non capisco la logica dietro la decisione di questa parte di Lua. Perché l'indicizzazione partono da 1? Ho letto (come molti altri hanno fatto) questa grande carta . Mi sembra uno strano angolo di un linguaggio che è molto piacevole da imparare e programma. Non fraintendetemi, Lua è semplicemente fantastico, ma ci deve essere una qualche spiegazione. La maggior parte di quello che ho trovato (sul web) è solo dicendo inizia indice a 1. fermata completa.

Sarebbe molto interessante leggere quello che hanno detto i suoi progettisti su questo argomento.

Si noti che io sono "molto" principiante in Lua, spero di non mi manca qualcosa di ovvio sulle tabelle.

È stato utile?

Soluzione

Lua discende da Sol, un linguaggio progettato per gli ingegneri del petrolio senza formazione in programmazione di computer. Le persone non addestrate nel calcolo pensano che è dannato strano per iniziare il conteggio a zero. Con l'adozione di uno a base di array e indicizzazione stringa, il Lua progettisti evitato confondendo le aspettative dei loro primi clienti e sponsor.

Anche se troppo li ho trovati strano all'inizio, ho imparato a matrici di amore 0-based. Ma ho da OK con array basati su 1 di Lua, soprattutto da parte utilizzando ciclo for generici di Lua e il ipairs operatore-I di solito può evitare di preoccuparsi di quanto gli array sono indicizzati.

Altri suggerimenti

Programmazione in Lua 's prima discussione di tavoli, accennano:

  

Poiché è possibile indicizzare una tabella con qualsiasi valore, si può iniziare gli indici di un array con qualsiasi numero che soddisfa voi. Tuttavia, è consuetudine in Lua iniziare array con 1 (e non con 0, come in C) e diverse strutture attenersi a questa convenzione.

In seguito, nel capitolo sulle strutture di dati, dicono quasi la stessa cosa di nuovo:. Che l'indicizzazione integrata in strutture assumere a base di 1 Lua

In ogni caso, ci sono un paio comodità di utilizzare l'indicizzazione 1-based. Vale a dire, il # (lunghezza) esercente: accesso t[#t] l'ultimo (numerico) indice della tabella, e t[#t+1] accessi 1 passato l'ultimo indice. A qualcuno che non sia già stato esposto a indicizzazione 0-based, #t+1 sarebbe più intuitivo per spostare oltre la fine di un elenco. C'è anche costrutto for i = 1,#t di Lua, che ritengo rientra nella stessa categoria del punto precedente che "1 alla lunghezza" può essere più sensibile di indicizzazione "0 alla lunghezza meno 1".

Ma, se non si può rompere la mentalità di indicizzazione 0-based, quindi indicizzazione 1 a base di Lua può certamente essere più di un ostacolo. In ultima analisi, gli autori hanno voluto qualcosa che ha funzionato per loro ; e devo ammettere che non so quale sia il loro originale obiettivo era, ma probabilmente è cambiato da allora.

C'è una ragione molto importante per non contare le matrici da 1: Se gli array partono da zero, è possibile utilizzare come anelli algebriche in modo naturale. Per esempio. abbiamo i giorni della settimana (day={'mo', 'tu', 'we'...) e vogliamo CICLO attraverso di loro. Allora sarebbe molto meno Una prigione mentale a scrivere:

nextday = day[(i+1)%7]  as it is in almost every other language

Than:

nextday = day[i%7+1] as it is in lua

non sembra essere così male in un primo momento, ma cercare di ciclo della settimana l'altro modo.

O più generale: se il set di indice manca lo zero, manca l'elemento neutro dell'addizione. Ogni volta che è necessario nei calcoli dell'indice, gli indici devono essere spostati.

Sono un matematico, ma ho accettato il fatto che quando si tratta di programmazione, il conteggio da zero è solo la scelta migliore ..

La mia comprensione è che è in questo modo solo perché gli autori hanno pensato che sarebbe stato un buon modo per farlo, e dopo aver rotolato la lingua al pubblico tale decisione calcificate considerevolmente. (Ho il sospetto che ci sarebbe inferno da pagare stavano per cambiare oggi!) Non ho mai visto una particolare giustificazione al di là di questo.

Forse un punto meno significativo, ma non ho sentito ancora citato: è meglio simmetria nel fatto che il primo e l'ultimo carattere in una stringa sono a 1 e -1, rispettivamente, invece di 0 e -1.

tabella [0] restituirà sempre nullo (null), a meno che assegnare il valore a voi stessi tabella [0] = 'qualche valore' e poi tabella [0] restituirà 'un valore' che si è assegnato.

Ecco un esempio:

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

Lua preferiscono indici di utilizzo che partono da 1. Tuttavia, è possibile utilizzare qualsiasi indice che si desidera. È possibile utilizzare 0, è possibile utilizzare 1, è possibile utilizzare -5. E 'anche nel loro manuale, che si trova al numero ( https://www.lua.org /pil/11.1.html ).

In realtà, qualcosa di fresco qui è librerie lua interni saranno il trattamento di alcune passate 0 di come 1 di. Basta essere prudenti quando si utilizza ipairs.
In modo che: ( "abc"): sub (0,1) == "a" e ( "abc"):. Sub (1,1) == "a" sarà vero

 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

La vera ragione è che il linguaggio è un'implementazione della definizione di una legge del Portogallo e il principale centro di sviluppo è stato in Brasile e la loro preferenza è quello di evitare l'uso di zero o vuoto o niente come un indice o pedice. Tuttavia la lingua non consentire l'uso di un indice di partenza diverso da 1 in una tabella funzione di creazione in alcune versioni.

Ha senso a tutti, che se un

table = {}

Al momento, table è vuoto. Così, quando

table == {something}

La tabella contiene qualcosa di così ciò che contiene è l'indice 1 in table se sai cosa voglio dire.

Intendevo proprio quella tabella [0] esiste, e la tabella = {}, che il suo vuoto, ora programmatore non chiamare un tavolo vuoto, li pone, e quindi riempie, sarà inutile trovare un tavolo ogni volta vuota che si desidera chiamare, quindi la sua più semplice per creare solo una tabella vuota.

Il mio inglese non sarà possibile ottenere una migliore e questo è il mio migliore grammatica. Se non ti piace, il tuo libero di non continuare a leggere, ma dando -rep per qualcuno che cerca di aiuto rende la gente non vuole aiuto a tutti, in particolare per qualcosa come la grammatica. Sono un uomo di numeri e VAR, senza grammatica. Siamo spiacenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top