我不了解Lua这部分决定背后的理由。为什么索引从1开始?我读过(和其他很多人一样)这篇伟大的论文。在我看来,这门语言很奇怪,学习和编程都很愉快。不要误会我的意思,Lua很棒,但是在某处必须有一个解释。我在网上发现的大多数内容只是说索引从1开始。
阅读其设计师对这一主题的看法将非常有趣。
请注意,我是Lua的“非常”初学者,希望我不要对表失去任何明显的东西。
我不了解Lua这部分决定背后的理由。为什么索引从1开始?我读过(和其他很多人一样)这篇伟大的论文。在我看来,这门语言很奇怪,学习和编程都很愉快。不要误会我的意思,Lua很棒,但是在某处必须有一个解释。我在网上发现的大多数内容只是说索引从1开始。
阅读其设计师对这一主题的看法将非常有趣。
请注意,我是Lua的“非常”初学者,希望我不要对表失去任何明显的东西。
Answers:
Lua是Sol的后代,Sol是为石油工程师设计的语言,未经计算机编程的正式培训。没有经过计算培训的人们认为,从零开始计数是不可思议的。通过采用基于1的数组和字符串索引,Lua设计师避免混淆了其第一批客户和赞助商的期望。
尽管一开始我也觉得它们很奇怪,但是我学会了爱基于0的数组。但是我对Lua的基于1的数组很满意,尤其是通过使用Lua的通用for
循环和ipairs
运算符-我通常可以避免担心数组的索引方式。
< length
它更方便使用,并且更容易在“基于Weirdo 0的语言”上阅读。我承认,当我看到一个从1开始迭代的循环时,我立即假定它从第二个元素开始:S
在Lua对表的首次讨论中的编程中,他们提到:
由于您可以使用任何值对表进行索引,因此可以使用任何您喜欢的数字来开始数组的索引。但是,在Lua中习惯以1(而不是像C中那样从0)开始数组,并且有一些设施遵循此约定。
稍后,在有关数据结构的章节中,他们再次说了几乎相同的话:Lua的内置功能假定基于1的索引。
无论如何,有对夫妇的便利,使用基于1的索引。即,#
(长度)操作:t[#t]
访问表中的最后一个(数字)索引,并t[#t+1]
访问1 过去的最后一个索引。对于尚未接触过基于0的索引的人来说,#t+1
越过列表的末尾会更直观。还有Lua的for i = 1,#t
构造,我相信它与上一点属于同一类别,即“索引长度1”比索引“ 0长度减去1”更明智。
但是,如果您无法打破基于0的索引的思维方式,那么Lua的基于1的索引肯定会更多地成为障碍。最终,作者想要一些对他们有用的东西。而且我承认我不知道他们最初的目标是什么,但是从那时起它可能已经改变了。
我的理解是,仅是因为作者认为这样做是一种好方法,所以在他们向公众推出该语言后,这一决定就变得相当重要了。(我怀疑如果他们今天改变它,那就得付出地狱的代价!)我再也没有看到任何特别的理由了。
array[0] == array + 0;
,而当数组实际上是一个哈希表时,基于1的计数更为自然。
Lua库更喜欢使用从1开始的索引。但是,您可以使用所需的任何索引。您可以使用0,可以使用1,可以使用-5。它甚至在他们的手册中,也可以在(https://www.lua.org/pil/11.1.html)上找到。
实际上,这里的一些很棒的事情是内部lua库会将将通过0的某些SOME视为1。使用配对时要谨慎。
这样:("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
将是真实的。
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
({'a', 'b'})[1]
评估为'b'
不'a'
有关系吗?这似乎是内置的。
({[0] = 'a', 'b'})[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]))
对于每个人来说,如果
table = {}
此刻,table
是空的。所以,当
table == {something}
该表包含一些内容,因此table
如果您知道我的意思,它包含的内容就是索引1 。
我的意思是它的表[0]存在,并且它的表= {},它是空的,现在程序员不会调用空表,而是先设置空表,然后将其填充,然后再找不到空表每次您要调用它时,都可以轻松创建一个空表。
我的英语不会更好,那是我最好的语法。如果您不喜欢它,您可以自由地不停地阅读它,但是给尝试帮助的人提供-rep会使人们根本不想帮助,尤其是在语法方面。我是一个数字和变量的人,不是语法。抱歉。
0
仅将索引用作元素的数组仍然不为空。实际上lua支持这一点,它不是默认约定。