Eu não entendo a lógica por trás da decisão desta parte de Lua. Por que a indexação começa em 1? Eu li (como muitos outros) este grande artigo . Parece-me um canto estranho de uma língua que é muito agradável de aprender e programar. Não me interpretem mal, Lua é simplesmente ótima, mas tem que haver uma explicação em algum lugar. A maior parte do que encontrei (na web) está apenas dizendo que o índice começa em 1. Ponto final.
Seria muito interessante ler o que seus designers disseram sobre o assunto.
Note que eu sou "muito" iniciante em Lua, espero não estar perdendo algo óbvio sobre tabelas.
Respostas:
Lua é descendente do Sol, uma linguagem projetada para engenheiros de petróleo sem treinamento formal em programação de computadores. Pessoas que não são treinadas em computação acham estranho começar a contar a zero. Ao adotar a indexação de matriz e string baseada em 1, os designers da Lua evitaram confundir as expectativas de seus primeiros clientes e patrocinadores.
Embora eu também os tenha achado estranhos no começo, aprendi a amar matrizes baseadas em 0. Mas eu entendi bem com as matrizes baseadas em 1 de Lua, especialmente usando o
for
loop genérico e oipairs
operador de Lua - geralmente posso evitar me preocupar com a maneira como as matrizes são indexadas.fonte
< length
for é muito mais útil e fácil de ler nos "idiomas estranhos baseados em 0". Confesso quando vejo uma iteração de loop a partir de 1, eu imediatamente assumir que começa a partir do 2º elemento: SNa primeira discussão de tabelas de Programação em Lua , eles mencionam:
Posteriormente, no capítulo sobre estruturas de dados, eles dizem quase a mesma coisa novamente: que as instalações internas de Lua assumem indexação baseada em 1.
De qualquer forma, existem algumas conveniências no uso da indexação baseada em 1. Ou seja, o
#
operador (comprimento):t[#t]
acessa o último índice (numérico) da tabela et[#t+1]
acessa 1 após o último índice. Para alguém que ainda não foi exposto à indexação baseada em 0,#t+1
seria mais intuitivo passar do final de uma lista. Há também afor i = 1,#t
construção de Lua , que acredito estar na mesma categoria do ponto anterior, que "1 ao comprimento" pode ser mais sensível do que indexar "0 ao comprimento menos 1".Mas, se você não pode quebrar a mentalidade da indexação baseada em 0, a indexação baseada em 1 de Lua certamente pode ser mais um obstáculo. Por fim, os autores queriam algo que funcionasse para eles ; e admito que não sei qual era o objetivo original , mas provavelmente mudou desde então.
fonte
Meu entendimento é que é assim apenas porque os autores pensaram que seria uma boa maneira de fazê-lo, e depois que eles lançaram a linguagem ao público, essa decisão se calcou consideravelmente. (Eu suspeito que haveria um inferno a pagar se eles mudassem hoje!) Eu nunca vi uma justificativa específica além disso.
fonte
array[0] == array + 0;
, e a contagem baseada em 1 é mais natural quando a matriz é realmente uma tabela de hash.Talvez um ponto menos significativo, mas que eu não ouvi falar ainda: há melhor simetria no fato de que o primeiro e o último caractere de uma string estão em 1 e -1 respectivamente, em vez de 0 e -1.
fonte
As bibliotecas Lua preferem usar índices que começam em 1. No entanto, você pode usar qualquer índice que desejar. Você pode usar 0, você pode usar 1, você pode usar -5. Está incluso no manual, que pode ser encontrado em ( https://www.lua.org/pil/11.1.html ).
De fato, algo interessante aqui é que as bibliotecas internas da lua tratam ALGUNS 0s passados como 1's. Apenas tenha cuidado ao usar ipairs.
Então isso:
("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
será verdade.fonte
({'a', 'b'})[1]
avaliar para'b'
não'a'
embora? Isso parece embutido para mim.({[0] = 'a', 'b'})[1]
O verdadeiro motivo é que a linguagem é uma implementação da definição em uma lei de Portugal e o principal centro de desenvolvimento estava no Brasil e sua preferência é evitar o uso de zero ou vazio ou nada como índice ou índice. No entanto, o idioma permite o uso de um índice inicial diferente de 1 em uma tabela, criando a função em algumas versões.
fonte
tabela [0] SEMPRE retornará nulo (nulo), A menos que você atribua valor a ela mesma tabela [0] = 'algum valor' e, em seguida, a tabela [0] retornará 'algum valor' que você designou.
Aqui está um exemplo:
fonte
Faz sentido para todos, que se um
No momento,
table
está vazio. Então quandoA tabela contém algo, então o que ela contém é o índice 1,
table
se você entende o que quero dizer.O que eu quis dizer é que essa tabela [0] existe e sua tabela = {}, que está vazia, agora um programador não chama uma tabela vazia, define-a e preenche-a, será inútil encontrar uma tabela vazia sempre que desejar chamá-lo, portanto, é mais simples criar uma tabela vazia.
Meu inglês não vai melhorar e essa é minha melhor gramática. Se você não gostar, estará livre para não continuar lendo, mas dar -rep para alguém que tenta ajudar faz com que as pessoas não queiram ajudar, especialmente para algo como gramática. Sou um homem de números e vars, não de gramática. Desculpe.
fonte
0
como único elemento ainda não está vazia. De fato, lua suporta isso, simplesmente não é a convenção padrão.