我和Lua有问题。它使用基于一的索引。该语言具有在索引0处设置值的功能,但该值不会被计为表长度的一部分,并且字符串操作仍然是基于一个的。因此,我认为该功能是特殊的,而不是索引。
我不想要一个基于一个或基于零的火焰。我只想问是否有强制从零开始索引的功能。
我认为Lua已经拥有了你需要让它基于0的功能。不幸的是,我所指的功能是Lua的开源许可证。
我无法找到Lua的补丁或分支,改变了该语言的基于1的性质。
不幸的是,要求Lua将其更改为0也会破坏向后兼容性。所有当前附加模块的丢失可能是为了易于使用而付出的代价。
使用0索引数组实际上非常简单:
local array={
[0]="zero",
"one",
"two"
}
for i=0,#array do
print(array[i])
end
您可以使用#array
而不减去1,因为长度运算符实际上返回最高索引(技术上,第一个零之前的键),而不是实际的“长度”(无论如何在Lua中都没有意义)。
对于字符串运算符,您可能只需要创建重复的函数(尽管可能有更好的方法)
ipairs()
也只支持1个索引,所以你必须定义自己的函数或者只使用常规的for
。
我知道这个问题已经有一年了,但我认为未来的搜索者会对这个事实感兴趣,CFF Explorer包含一个脚本语言(带补丁的Lua),它有0索引表补丁:
http://www.ntcore.com/files/cffscriptv2.htm
此外,在上面的文档中,作者声称他必须禁用大多数标准库函数,因为它们与0索引数组不兼容,所以请重申你对这个问题的思考过程:)
Eonil对ponzao答案的评论:真正的问题是基本语言应该是C语言,它是基于0的索引语言。必须正确转换脚本和主机之间的索引数据交换。
如果要将C数据结构公开给Lua,请使用userdata
将它们打包。您可以根据自己的喜好使用metatable来使索引行为。这样,您就可以确保正确的翻译。
即使在Lua来源中有一个#define TABLE_START_INDEX 1
(我不相信它),你也会通过改变它来拍摄自己。这是因为大多数库使用基于1的索引。因此,执行类似以下操作的任何代码都会破坏。
对于i = 1,#t do ...结束
您当然可以使用迭代器甚至创建辅助函数来避免这种情况。
function get_first(t)return t [1] end
可能虽然您尝试解决的实际问题比从0更改为基于索引的索引更困难。
肮脏的方法有一些缺点:
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
,因为__len metamethod
不受表格和字符串的尊重。
但请记住,table.insert
和其他表格方法将不再适用于此,因为插入现在通过t[#t] = x
完成。
我不建议使用它。
您可以通过使用知道不同索引库的迭代器来修复此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
直接答案:修改Lua的源代码。将lua table
上的所有操作更改为base-0。
在这里,我正在使用Lua标准库。 Windows二进制可用。
http://lua-users.org/wiki/CountingFromOne(底部的一些评论)
https://github.com/farteryhr/lua-base-0(请参阅已修改内容的提交历史记录)
大部分脏工作大约+1 -1,其中大部分都已完成。
请写一些测试用例(尽可能多地包含语言的详细信息)并报告错误。
(目前已知知道metatable还有问题,但我没时间去研究它)
你的问题的答案是否定的,没有办法强迫lua用索引0处理的所有过程,因为就我所知,#table从1开始,“n”而没有它索引0它几乎没用,在我看来,但取决于你想做什么,你可以比较,如果你有什么或不,从表,1读取产品,1,读取收入,如果产品增加,你有更多,如果产品是= 1然后你就没有了,所以你只读了1个表,而不是2个,我希望我能清楚自己<,<