有目的地选择数组元素超出范围

时间:2016-12-12 12:59:27

标签: arrays lua

假设以下数组:

a = {"a", "b", "c"}

使用a[3],我可以访问c。但是如何让字符串“永远重复”(虽然它仍然只有元素)?例如:

a[4] --will return nil, but I need to to return "a", because 4 is 3 (end of array) + 1 (the element I need).

问题:

如果a[4]由3个元素组成,我如何使a[1]返回与a[]相同的值?

2 个答案:

答案 0 :(得分:4)

您可以确保您使用的密钥在适当的范围内,或者通过实现__index元方法将该逻辑移动到metatable中。这样你告诉Lua当有人访问你桌子中的无效密钥时要返回什么。 见http://lua-users.org/wiki/MetamethodsTutorial

local function circle(arr)
   setmetatable(arr, {__index =
      function(t, k)
         if type(k) == "number" and #t > 0 then
            return rawget(t, (k-1) % #t + 1)
         end
      end
   })
end

local a = {"a", "b", "c"}
circle(a)

for j = -10, 10 do
   print(j, a[j])
end

答案 1 :(得分:0)

这只是Egor Skriptunoff正确回答的一个细微变化,因为如果留下评论,我不希望格式丢失。

在我看来,这个使得表创建更简单的单个语句,并且更清楚地表达了预期的操作。它还使用与元表相同的表作为次要优化。

local
function circle(arr)
  function arr.__index(t, k)
    if type(k) == 'number' and #t > 0 then
      return rawget(t, (k-1) % #t + 1)
    end
  end
  return setmetatable(arr,arr)
end

local a = circle {'a', 'b', 'c'}

for j = -10, 10 do print(j, a[j]) end