如何在lua中创建一个没有迭代的数组

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

arr = [0] * size

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

local arr = {} for i=1,size do arr[i] = 0 end

是否有任何我可以用python样式在lua中做到这一点的方法?非常感谢大家。

点赞
用户5991423
用户5991423

似乎没有使用该语言语法构建此计划的方法。相反,考虑创建一个生成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

编辑:上述示例并不意味着完美的解决方案,我强烈反对在不了解其限制的情况下复制代码。确实,如果您需要允许布尔值,请更改函数以适应您的需求。将值作为可选参数的建议是方便举例。建议代码允许false是一个好建议,但该答案展示了一种选项而不是详尽的解决方案。

2016-03-25 06:05:15
用户3677376
用户3677376

虽然我不建议这样做,但是你可以在 Lua 中接近 Python 的语法:

local A = require"A"  -- 请参见下面 module "A" 的代码实现

-- ...

local t = A[0] * 10

for i,v in ipairs( t ) do
  print( i, v )
end

这是 module "A" 的代码:

local M_meta = {}
local M = setmetatable( {}, M_meta )

local function forbid_operation()  -- 防止错误操作
  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 -- 在例如 `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 )
  -- 使用 M_table 作为私有键:只有此模块可以访问它,因为它是局部的
  return setmetatable( { [ M_meta ] = v }, O_meta )
end

M_meta.__index = index_or_call  -- A[0] 语法
M_meta.__call = index_or_call  -- 允许使用 A(0) 语法
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 元方法从私有字段中检索值,并使用给定值创建请求长度的数组,然后将其返回。

2016-03-26 10:38:32