我需要创建一个由变量指定长度的零表。在python中,我可以写:
arr = [0] *尺寸
但是在lua中,我只能这样做:
local arr = {} 对于i = 1,大小做 arr [i] = 0 端
有没有什么方法可以用lua和python风格做到这一点?谢谢大家。
答案 0 :(得分:5)
似乎没有任何方法可以使用语言的语法来创建它。相反,请考虑创建一个生成size
数组的函数。然后你可以简单地说arr = newArray(5)
或类似的。
function newArray (size)
local arr = {}
for i=1, size do
arr[i] = 0
end
return arr
end
您可以扩展此功能以创建使用任何值初始化的数组:
function newArray (size, value)
value = value or 0
local arr = {}
for i=1, size do
arr[i] = value
end
return arr
end
编辑:上面的例子并不是完美的解决方案,我强烈反对复制代码而不理解它的局限性。实际上,如果您需要允许布尔值,请更改函数以满足您的需要。使值成为可选参数的编辑是方便的一个例子。代码允许错误的建议是一个很好的建议,但答案显示了一个选项,而不是一个详尽的解决方案。
答案 1 :(得分:0)
不是我会推荐它,但你可以在Lua中非常接近Python的语法:
local A = require"A" -- see below for the implementation of module "A"
-- ...
local t = A[0] * 10
for i,v in ipairs( t ) do
print( i, v )
end
以下是模块的代码" A":
local M_meta = {}
local M = setmetatable( {}, M_meta )
local function forbid_operation() -- to prevent mistakes
error( "not a regular table, operation forbidden!" )
end
local O_meta = {
__index = forbid_operation,
__newindex = forbid_operation,
__pairs = forbid_operation,
__ipairs = forbid_operation,
__mul = function( self, n )
if type( self ) == "number" then
self, n = n, self -- swap values in case of e.g. `3 * A[0]`
end
local t, v = {}, self[ M_meta ]
for i = 1, n do
t[ i ] = v
end
return t
end,
__metatable = false,
}
local function index_or_call( self, v )
-- use M_table as a private key: no-one but this module
-- can access it, because it is local
return setmetatable( { [ M_meta ] = v }, O_meta )
end
M_meta.__index = index_or_call -- A[0] syntax
M_meta.__call = index_or_call -- A(0) syntax is also allowed
M_meta.__newindex = forbid_operation
M_meta.__pairs = forbid_operation
M_meta.__ipairs = forbid_operation
M_meta.__metatable = false
return M
该模块实际上返回一个包含自定义__index
(和__call
)元方法的表格。调用__index
或__call
时,将返回另一个表,其中给定值存储在私有字段和__mul
元方法中。 __mul
元方法从私有字段中检索值,并使用给定值创建所请求长度的数组,并将其返回。