为什么Lua数组(表)从1开始而不是0?

我不明白Lua这部分决定背后的理由。 为什么索引从1开始? 我已经阅读过(和其他人一样) 这篇伟大的论文 。 在我看来,一个非常愉快的学习和编程语言的一个奇怪的angular落。 不要误解我的意思,Lua很棒,但是必须有一个解释。 我发现的大多数(在网上)只是说索引从1开始。

阅读devise师对这个主题的看法是非常有趣的。

请注意,我是Lua的“非常”初学者,我希望我不会错过有关桌子的事情。

Lua来自Sol,一种为石油工程师devise的语言,没有经过正式的计算机编程培训。 没有受过计算机培训的人认为从零开始计算是件怪事。 通过采用基于1的数组和string索引,Luadevise师避免混淆了第一个客户和赞助商的期望。

虽然我在开始的时候也觉得奇怪,但我已经学会了喜欢基于0的arrays。 但是我用Lua的基于1的数组,尤其是通过使用Lua的genericsfor循环和ipairs操作符,我可以避免担心数组是如何索引的。

Lua第一次讨论表格的编程中 ,他们提到:

既然你可以用任何值索引一个表,你可以用任何令你满意的数字开始一个数组的索引。 然而,在Lua中习惯使用1来启动数组(而不是像C中那样使用0),并且有几个设施坚持这个约定。

后来,在关于数据结构的章节中,他们又说了几乎相同的事情:Lua的内置设施假设从1开始索引。

无论如何,使用基于1的索引是有一些方便的。 即, # (长度)运算符: t[#t]访问表的最后一个(数字)索引,并且t[#t+1] t[#t] t[#t+1]访问最后一个索引之后的1。 对于还没有接触过基于0的索引的人来说, #t+1会更直观地移动到列表的末尾。 也有Lua的for i = 1,#t结构,我认为属于前一点,“1到长度”可以比索引“0到长度减1”更合理。

但是,如果你不能打破基于0的索引的思维方式,那么Lua基于1的索引肯定会成为一个障碍。 最终,作者想要一些对他们有用的东西; 我承认我不知道他们最初的目标是什么,但是从那以后它可能已经改变了。

我的理解是,就是这样,因为作者认为这是一个很好的办法,在向公众推广语言之后,这个决定就会大大地降低。 (我怀疑如果今天他们要改变的话,他们将会付出代价!)除此之外,我从来没有见过一个特别的理由。

有一个非常重要的原因不是从1开始对数组进行计数:如果数组从零开始,可以以自然的方式将它们用作代数环。 例如,我们有一周的时间( day={'mo', 'tu', 'we'... ),我们想通过它们循环。 那么写下这个话题就会less得多:

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

比:

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

起初似乎并不那么糟糕,但试着以另一种方式周而复始。

或者更一般地说:如果指数集缺乏零点,则缺乏加和的中性元素。 无论何时需要索引计算,指数都必须移位。

我是一个math家,但我已经接受这样的事实,即编程时,从零开始计数只是更好的select。

也许是一个不太重要的点,但我还没有听说过的一个string中的第一个和最后一个字符分别为1和-1,而不是0和-1。

table [0]将总是返回nil(null),除非你自己给它赋值table [0] ='some value',然后table [0]将返回你赋值的'some value'。

这里是一个例子:

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

真正的原因是语言是葡萄牙法律定义的一个实现,主要的发展中心在巴西,他们的select是避免使用零或空或不作为索引或下标。 但是,在某些版本中,语言确实允许在表创build函数中使用1以外的开始索引。

这对每个人都是有道理的,如果一个人

 table = {} 

目前, table是空的。 所以,什么时候

 table == {something} 

该表包含的东西,所以它包含的是table 1中的索引,如果你知道我的意思。

我的意思是它的table [0]存在,它的table = {},它的空,现在程序员不会调用一个空表,它设置它们,然后填充它,find一个空表每次你想调用它,所以更简单的只是创build一个空表。

我的英语不会好起来,这是我最好的语法。 如果你不喜欢它,那么你可以自由地不去阅读,但是给那些试图帮助别人的人 – 让他们不想帮忙,特别是像语法这样的东西。 我是一个数字和变数的人,而不是语法。 抱歉。