【问题标题】:Is there a way to eliminate the repeating function in Lua?有没有办法消除Lua中的重复功能?
【发布时间】:2020-03-27 15:54:46
【问题描述】:

我有以下delayed 函数,在按下每个按钮 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 中的代码量。

【问题讨论】:

    标签: lua


    【解决方案1】:

    您可以在循环中设置M 的表条目,将循环索引作为上值分配closures

    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
    

    【讨论】:

      【解决方案2】:

      @Henri 有你要找的东西;但我想知道为什么你首先要创建 64 个函数重复项?它们似乎都在执行相同的逻辑,那么为什么不使用一个函数来接收带有印刷次数的参数呢?函数定义看起来像......

      local function delayed(presses_array, press_num)
          for id, press in ipairs(presses_array) do
              if press.num == press_num then
                  press.holdMode = true
                  press.shouldUntrigger = false
                  break
              end
          end
      end
      

      【讨论】:

      • 在原始任务中,被调用函数的身份是为循环提供所需的信息。闭包做同样的事情,将信息存储在一个上值中,并引用循环代码 - 它由所有闭包共享,而不是复制。使用您的代码,您也有一个循环实例,但现在您必须找到一种方法将 id 报告给函数,这在原始帖子中没有。如果 delayed 函数作为回调从不提供额外用户数据的 gui 元素中调用,则它可能不容易检索。
      猜你喜欢
      • 2020-06-23
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多