我可以强制Lua的表索引从零开始吗?

时间:2010-08-07 13:20:39

标签: indexing lua

我和Lua有问题。它使用基于一的索引。该语言具有在索引0处设置值的功能,但该值不会被计为表长度的一部分,并且字符串操作仍然是基于一个的。因此,我认为该功能是特殊的,而不是索引。

我不想要一个基于一个或基于零的火焰。我只想问是否有强制从零开始索引的功能。

10 个答案:

答案 0 :(得分:4)

使用0索引数组实际上非常简单:

local array={
[0]="zero",
    "one",
    "two"
}

for i=0,#array do
    print(array[i])
end

您可以使用#array而不减去1,因为长度运算符实际上返回最高索引(技术上,第一个零之前的键),而不是实际的“长度”(无论如何在Lua中都没有意义) )。

对于字符串运算符,您可能只需要创建重复的函数(尽管可能有更好的方法)

ipairs()也只支持1个索引,因此您必须定义自己的功能,或者只使用常规for

答案 1 :(得分:3)

我知道这个问题已经有1年了,但我认为未来的搜索者会对这个事实感兴趣,CFF Explorer包含一个脚本语言(带补丁的Lua),它有0索引表补丁:

http://www.ntcore.com/files/cffscriptv2.htm

此外,在上面的文档中,作者声称他必须禁用大多数标准库函数,因为它们与0索引数组不兼容,所以请重申您对此问题的思考过程:)

答案 2 :(得分:2)

我认为Lua已经拥有了你需要让它基于0的功能。不幸的是,我所指的功能是Lua的开源许可证。

我无法找到Lua的补丁或分支,改变了该语言的基于1的性质。

不幸的是,让Lua将其更改为0也会破坏向后兼容性。所有当前附加模块的丢失可能是为了易于使用而付出的代价。

答案 3 :(得分:1)

即使Lua来源中有一个#define TABLE_START_INDEX 1(我认为不存在),你也可以通过改变它来拍摄自己。这是因为大多数库使用基于1的索引。因此,执行类似以下操作的任何代码都会破坏。

  

表示i = 1,#t do ...结束

您当然可以使用迭代器甚至创建辅助函数来避免这种情况。

  

function get_first(t)return t [1] end

虽然您尝试解决的实际问题比从0更改为基于1的索引更难。

答案 4 :(得分:1)

Eonil对ponzao答案的评论:真正的问题是基本语言应该是基于0的索引语言的C语言。必须正确翻译脚本和主机之间的索引数据交换。

如果要将C数据结构公开给Lua,请使用userdata打包它们。您可以根据自己的喜好使用metatable来使索引行为。这样,您就可以确保正确的翻译。

答案 5 :(得分:1)

肮脏的方法有一些缺点:

function zeroIndexed(tbl)
    local mt = {}
    mt.data = tbl
    mt.__index = function(t, k)
        return mt.data[(type(k) == "number" and k + 1 or k)]
    end
    mt.__newindex = function(t, k, v)
        mt.data[(type(k) == "number" and k + 1 or k)] = v
    end
    mt.__len = function()
        return #mt.data
    end
    return setmetatable({}, mt)
end
t = zeroIndexed({5, 6, 7})
print(t[0], t[1], t[2])
t[0] = 4
print(t[0], #t)
t[#t] = 8
print(t[#t - 1], #t)

Lua 5.2输出:

5       6       7
4       3
8       4

在Lua 5.1中#t返回0,因为表{1}}不适用于表和字符串。

但请记住__len metamethod和其他表方法不再适用,因为现在通过table.insert进行插入。

我不建议使用它。

答案 6 :(得分:0)

你可以通过使用知道不同索引库的迭代器来修复这个lua-flaw:

function iarray(a)
  local n = 0
  local s = #a
  if a[0] ~= nil then
    n = -1
  end
  return function()
    n = n + 1
    if n <= s then return n,a[n] end
  end
end

但是,您仍然需要手动添加第0个元素:

用法示例:

myArray = {1,2,3,4,5}
myArray[0] = 0
for _,e in iarray(myArray) do
  -- do something with element e
end

答案 7 :(得分:-1)

直接答案:修改Lua的源代码。将lua table上的所有操作更改为以0为底。

在这里,我正在做它以及Lua标准库。 Windows二进制文件可用。

http://lua-users.org/wiki/CountingFromOne(底部有一些评论)

https://github.com/farteryhr/lua-base-0(有关修改内容,请参见提交历史记录)

大多数关于+1 -1的肮脏工作,其中大多数已经完成。

请编写一些测试用例(尽可能多的语言细节)并报告错误。

(目前已知metatable仍然存在问题,但我找不到时间进行调查)

答案 8 :(得分:-2)

你的问题的答案是否定的,没有办法强制lua用索引0处理的所有进程,因为就我所知,#table从1开始,“n”并且没有它索引0在我看来,几乎没用,但取决于你想要做什么,你可以比较一下你是否有东西,从表到1,读取产品,1读取收入,如果产品增加你有更多,如果产品是= 1,那么你就没有了,所以你只读了1个表而不是2个,我希望我自己清楚&lt;,&lt;

答案 9 :(得分:-2)

我发现在与索引为 0 的语言(例如 C)交互时,最简单的方法是不使用索引 0。这会浪费内存,但更改 lua 非常荒谬。