如何在没有迭代的情况下创建lua数组

时间:2016-03-25 05:47:22

标签: arrays lua

我需要创建一个由变量指定长度的零表。在python中,我可以写:

  

arr = [0] *尺寸

但是在lua中,我只能这样做:

  

local arr = {}       对于i = 1,大小做           arr [i] = 0       端

有没有什么方法可以用lua和python风格做到这一点?谢谢大家。

2 个答案:

答案 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元方法从私有字段中检索值,并使用给定值创建所请求长度的数组,并将其返回。