有没有办法在Lua中消除重复函数?

我有以下的“延迟”函数,每按一次按钮后会被调用500毫秒。

function M.delayed1()
  for i = 1, #presses do
    if presses[i].num == 1 then
      presses[i].holdMode = true
      presses[i].shouldUntrigger = false
      return
    end
  end
end

function M.delayed2()
  for i = 1, #presses do
    if presses[i].num == 2 then
      presses[i].holdMode = true
      presses[i].shouldUntrigger = false
      return
    end
  end
end

function M.delayed3()
  for i = 1, #presses do
    if presses[i].num == 3 then
      presses[i].holdMode = true
      presses[i].shouldUntrigger = false
      return
    end
  end
end

function M.delayed4()
  for i = 1, #presses do
    if presses[i].num == 4 then
      presses[i].holdMode = true
      presses[i].shouldUntrigger = false
      return
    end
  end
end

实际上,由于我使用了总共64个按钮,所以代码要长得多。 我想知道在这种情况下是否有可能在Lua中减少代码量。

点赞
用户1944004
用户1944004

你可以在循环中设置 M 表格的项,将闭包赋值为循环索引的上值。

local M = {}
for n = 1, 64 do
  M["delayed" .. tostring(n)] = function()
    for i = 1, #presses do
      if presses[i].num == n then
        presses[i].holdMode = true
        presses[i].shouldUntrigger = false
        return
      end
    end
  end
end
2019-12-03 04:30:57
用户4383587
用户4383587

@Henri 有你正在寻找的东西;但是我想知道为什么一开始要创建 64 个功能重复的函数?它们似乎都执行相同的逻辑,为什么不创建一个单一的函数,该函数接收一个按键数量的参数?函数定义将如下所示...

局部函数(delayed)(presses_array、press_num)
    for id, press in ipairs(presses_array)do
        如果按下.num == press_num then
            press.holdMode = true
            press.shouldUntrigger = false
            break
        结束
    结束
结束
2019-12-03 13:07:09