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

Ara*_*raK 120 arrays lua lua-table

我不明白Lua这一部分的决定背后的理由.为什么索引从1开始?我读过(和其他人一样)这篇伟大的论文.在我看来,语言的一个奇怪的角落是非常愉快的学习和编程.不要误会我的意思,Lua很棒,但必须在某处做出解释.我发现的大部分内容(在网上)只是说索引从1开始.完全停止.

阅读其设计师对该主题的看法将是非常有趣的.

请注意,我在Lua中"非常"初学者,我希望我不会错过关于表格的明显内容.

Nor*_*sey 133

Lua是Sol的后裔,这是一种为石油工程师设计的语言,没有正式的计算机编程培训.没有接受过计算机培训的人认为从零开始计算是非常奇怪的.通过采用基于1的阵列和字符串索引,Lua设计者避免混淆他们的第一个客户和赞助商的期望.

虽然我在开始时发现它们很奇怪,但我学会了喜欢基于0的数组.但是我可以使用Lua的基于1的数组,尤其是使用Lua的通用for循环和ipairs运算符 - 我通常可以避免担心数组的索引方式.

  • @Eonil实际上避免显式索引减少了索引错误. (21认同)
  • @Eonil历史原因通常是相关的.你从一些东西开始,然后你永远不能改变它,因为它会破坏所有现有的代码.特别糟糕的是0对1索引,因为它破坏的方式非常微妙. (8认同)
  • 这只是一个历史性的营销原因.没有理性的理由,特别是在当前.甚至你似乎都试图避免使用基于1的索引而不是使用它:) (6认同)
  • 区别在于从1到长度以及从0到长度-1,但在for循环中,`<length`在"基于古怪0的语言"上更方便,更容易阅读.当我看到从1迭代循环时,我承认,我立即假设它从第二个元素开始:S (5认同)
  • 谢谢先生,我开始阅读Lua的演变. (2认同)

Mar*_*off 42

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

由于您可以使用任何值索引表,因此您可以使用任何数字来启动数组的索引.但是,在Lua中习惯于使用1启动数组(而不是使用0,如在C中),并且有几个设施坚持这个约定.

后来,在关于数据结构的章节中,他们再次说了几乎相同的事情:Lua的内置工具假设基于1的索引.

无论如何,使用基于1的索引有几个便利.即,#(长度)操作:t[#t]访问表的最后一个(数字)指数,以及t[#t+1]访问1 过去的最后一个索引.对于尚未接触过基于0的索引的人来说,#t+1移动到列表末尾会更直观.还有Lua的for i = 1,#t构造,我认为它与前一点属于同一类别,"1到长度"比将"0到长度减去1"更为明智.

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


joh*_*ala 23

有一个非常重要的原因是不从1开始计算数组:如果数组从零开始,您可以以自然的方式将它们用作代数环.例如,我们有一周(day={'mo', 'tu', 'we'...)的日子,我们希望通过它们循环.那么写下来的心态就会少得多:

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

比:

nextday = day[i%7+1] as it is in lua
Run Code Online (Sandbox Code Playgroud)

起初似乎并不那么糟糕,但试着以另一种方式循环一周.

或者更一般地说:如果索引集缺少零,它缺少添加的中性元素.无论何时在索引计算中需要,都必须转移指数.

我是一名数学家,但我已经接受了这样一个事实,即在编程时,从零开始计算只是更好的选择.

  • Houshalter,情况更糟.因为在这个例子中,第一种情况(从0开始)是循环组中自然的思维方式.如果您在基于1的索引中执行此操作,则必须先将其弄清楚.在任何需要模数运算的地方,基于1的索引都会妨碍你,你会发现自己在整个地方都写着+1,-1. (8认同)
  • 在计算机语言的背景下,基于1的不是"自然的".数学不仅仅是数数. (7认同)
  • 我不明白这是怎么回事,无论哪种方式,你都在进行相同数量的操作.只是一个不同的顺序.它甚至更短,因为你不需要括号. (4认同)
  • 我不明白这如何回答为什么Lua表从1开始的问题。您似乎只是在解释为什么数组应该从0开始索引,而没有解释为什么Lua不这样做。 (3认同)
  • 看你怎么写-1/+ 1到处都是? (2认同)

das*_*ang 14

我的理解是,就是这样,因为作者认为这是一种很好的方式,并且在他们将语言推向公众之后,决定大大加重了.(我怀疑如果他们今天要改变它将会付出代价!)除此之外,我从未见过特别的理由.

  • Lua指数实际上是指数.在C中,当你说索引你真正的意思是偏移. (18认同)
  • 可能的理由:C只做它,因为数组基本上只是一个指针和`array [0] == array + 0;`,当数组实际上是一个哈希表时,基于1的计数更自然. (5认同)

use*_*111 6

Lua 库更喜欢使用从 1 开始的索引。但是,您可以使用任何您想要的索引。可以使用 0、可以使用 1、可以使用 -5。它甚至在他们的手册中,可以在(https://www.lua.org/pil/11.1.html)找到。

事实上,这里很酷的一点是内部 lua 库会将某些传递的 0 视为 1。使用 ipair 时要小心。
所以:("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
Run Code Online (Sandbox Code Playgroud)

  • `({[0] = 'a', 'b'})[1]` (6认同)
  • 有没有办法让 `({'a', 'b'})[1]` 计算为 `'b'` 而不是 `'a'` ?这对我来说似乎是内置的。 (2认同)

小智 5

也许是一个不太重要的观点,但我还没有提到过:在字符串中的第一个和最后一个字符分别为1和-1而不是0和-1的事实中,存在更好的对称性.

  • 虽然这很好,但它不是*从1开始的原因. (7认同)
  • 这并不是更好的对称性。现在您遇到的情况是 -3、-2、-1、1、2 和 3 是有效索引,但不是 0! (4认同)