Indexing 我可以强制Lua';表索引是否从零开始?

Indexing 我可以强制Lua';表索引是否从零开始?,indexing,lua,Indexing,Lua,我和Lua有问题。它使用基于一个的索引。该语言具有在索引0处设置值的功能,但该值不会被计算为表长度的一部分,并且字符串操作仍然是基于索引0的。因此,我认为该功能是一种特殊的功能,而不是索引功能 我不想要一个一基或零基的火焰。我只是问有没有一个功能可以强制执行基于零的索引。即使Lua源文件中有一个#define TABLE_START_INDEX 1(我不相信有),如果改变它,你也会伤到自己的脚。这是因为大多数库使用基于1的索引。因此,任何执行以下操作的代码都会中断 当i=1时,不做。。。结束 当

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

我不想要一个一基或零基的火焰。我只是问有没有一个功能可以强制执行基于零的索引。

即使Lua源文件中有一个
#define TABLE_START_INDEX 1
(我不相信有),如果改变它,你也会伤到自己的脚。这是因为大多数库使用基于1的索引。因此,任何执行以下操作的代码都会中断

当i=1时,不做。。。结束

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

函数get_first(t)返回t[1]end


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

我认为Lua已经具备了使其基于0的功能。不幸的是,我提到的特性是Lua的开源许可证

我找不到Lua的补丁或分支,它改变了语言基于1的本质


不幸的是,将Lua更改为基于0也会破坏向后兼容性。丢失所有当前的附加模块可能是一个太大的代价,无法为易用性付出代价。

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


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

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


如果您想向Lua公开C数据结构,请使用
userdata
将它们打包。您可以使用元表使索引按照自己喜欢的方式进行。通过这种方式,您可以确保正确的翻译。

您的问题的答案是否定的,没有办法强制lua使用索引0处理所有过程,因为据我所知,现在表从1开始,n,没有它,索引0在我看来几乎没有用,但取决于您想做什么,你可以比较,如果你有或没有,从到表,1读产品,1读收入,如果产品增加,你有更多,如果产品=1,那么你有零,所以你只看1个表,而不是2个表,我希望我自己清楚肮脏的方法有一些缺点:

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
在Lua5.1中,t返回
0
,因为表和字符串不考虑
\uu len元方法

但是请记住,
table.insert
和其他表方法在这里不再起作用,因为插入现在是通过
t[#t]=x
完成的


我不建议使用此选项。

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

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

for i=0,#array do
    print(array[i])
end
您可以使用
#array
而不减去1,因为length操作符实际上返回的是最高索引(从技术上讲,是第一个nil之前的键),而不是实际的“length”(这在Lua中是没有意义的)

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


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

您可以通过使用了解不同索引基的迭代器修复此lua缺陷:

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

直接回答:修改Lua的源代码。将Lua
表上的所有操作更改为base-0

在这里,我和Lua标准库一起做这件事。Windows二进制文件可用

(下面是一些评论)

(有关已修改的内容,请参阅提交历史记录)

大部分是关于+1-1的脏活,而且大部分都已经完成了

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


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

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

我可以问问为什么这是一个问题吗?好吧,那么你更喜欢0-索引,但是为什么你不能使用1-索引呢?我也有这个问题:)不管有什么意义,我几乎每次都会在lua中出错。我已经习惯了使用其他基于零的语言,所以我的lua代码充满了bug,仅仅是因为这一点!我不认为有什么标志会将lua从1切换到0,因此除了修改需要使用非标准lua的lua(我在这里称为lua0)之外,我不知道它会是什么样子done@gnud这显然是一个问题,因为它是C脚本,而不是XPath脚本。当然我可以使用单索引,但对我来说效率太低了,因为我很笨,因为我觉得很难同时使用双索引系统。(对于主机系统,我必须使用C),脚本和主机之间交换的任何索引数据都必须翻译。我可以肯定这会导致更多我觉得难以处理的bug。@判断我认为这是不同的问题,因为我问了一种改变语言默认行为的方法,而问题是问语言设计的合理原因。不。这不是一个真正的问题。真正的问题是基础语言应该是C语言,它是基于0的索引语言。指数
myArray = {1,2,3,4,5}
myArray[0] = 0
for _,e in iarray(myArray) do
  -- do something with element e
end