有没有比传递一个40个对象的表格更简单的方法?

我正在运行这些包含五个子案例的数字请求,每个子案例都有四个子案例。这些案例中有超过200个,其中仅显示了一个,因此将会有几千行代码。(这是示例代码,数字当然不会全部相同。)

  elseif case1 then
                      if u <= 0 then if w == 0 then return B(2,3), B(3,4)
                                 elseif w == 1 then return B(2,3), B(3,4)
                                 elseif w == 2 then return B(2,3), B(3,4)
                                 elseif w >= 3 then return B(2,3), B(3,4)
               elseif if u == 1 then return LimitCheck(if w == 0 then return B(2,3), B(3,4)
                                 elseif w == 1 then return B(2,3), B(3,4)
                                 elseif w == 2 then return B(2,3), B(3,4)
                                 elseif w >= 3 then return B(2,3), B(3,4)
               elseif if u == 2 then return LimitCheck(if w == 0 then return B(2,3), B(3,4)
                                 elseif w == 1 then return B(2,3), B(3,4)
                                 elseif w == 2 then return B(2,3), B(3,4)
                                 elseif w >= 3 then return B(2,3), B(3,4)
               elseif if u == 3 then return LimitCheck(if w == 0 then return B(2,3), B(3,4)
                                 elseif w == 1 then return B(2,3), B(3,4)
                                 elseif w == 2 then return B(2,3), B(3,4)
                                 elseif w >= 3 then return B(2,3), B(3,4)
               elseif if u == 4 then return LimitCheck(if w == 0 then return B(2,3), B(3,4)
                                 elseif w == 1 then return B(2,3), B(3,4)
                                 elseif w == 2 then return B(2,3), B(3,4)
                                 elseif w >= 3 then return B(2,3), B(3,4)

我想到了一个聪明的方法并将重复的代码分隔成部分,让子函数拆分案例:

  local function LimitCheck(arg)
    if w <= 0 then return arg[1], arg[2]
    elseif w == 1 then return arg[3], arg[4]
    elseif w == 2 then return arg[5], arg[6]
    elseif w >= 3 then return arg[7], arg[8]
    end
  end
  local function Limits(arg)
    if u == 0 then return LimitCheck({arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],arg[7],arg[8],})
    elseif u == 1 then return LimitCheck({arg[9],arg[10],arg[11],arg[12],arg[13],arg[14],arg[15],arg[16],})
    elseif u == 2 then return LimitCheck({arg[17],arg[18],arg[19],arg[20],arg[21],arg[22],arg[23],arg[24],})
    elseif u == 3 then return LimitCheck({arg[25],arg[26],arg[27],arg[28],arg[29],arg[30],arg[31],arg[32],})
    elseif u == 4 then return LimitCheck({arg[33],arg[34],arg[35],arg[36],arg[37],arg[38],arg[39],arg[40]})
    end
  end

然后让主函数在一次返回所需信息:

  elseif case1 then
    return Limits({B(5,6),B(7,8),   B(5,6),B(5,6),  B(5,6),B(5,6),  B(5,6),B(5,6),
                   B(5,6),B(5,6),   B(5,6),B(5,6),  B(5,6),B(5,6),  B(5,6),B(5,6),
                   B(5,6),B(5,6),   B(5,6),B(5,6),  B(5,6),B(5,6),  B(5,6),B(5,6),
                   B(5,6),B(5,6),   B(5,6),B(5,6),  B(5,6),B(5,6),  B(5,6),B(5,6),
                   B(5,6),B(5,6),   B(5,6),B(5,6),  B(5,6),B(5,6),  B(5,6),B(5,6)})

问题是,这是一个传递每次都要传入的40个表格对象,这对于可能每秒发生100次的请求来说是一个很庞大的任务。并且它返回了一堆没有被使用的东西。 我想知道是否有一种节省资源的方法来完成这个任务。

原文链接 https://stackoverflow.com/questions/71034945

点赞
stackoverflow用户2858170
stackoverflow用户2858170

以下是使用查找表的示例。如果结构允许,可以硬编码或从代码构建。

local LUT = {
  [0] = {
    [0] = "a",
    [1] = "b",
    [2] = "c",
    [3] = "d",
  },
  [1] = {
    [0] = "e",
    [1] = "f",
    [2] = "g",
    [3] = "h",
  },
  [2] = {
    [0] = "i",
    [1] = "j",
    [2] = "k",
    [3] = "l",
  },
  [3] = {
    [0] = "m",
    [1] = "n",
    [2] = "o",
    [3] = "p",
  },
  [4] = {
    [0] = "q",
    [1] = "r",
    [2] = "s",
    [3] = "t",
  },
}

function lookup(u, w)
  -- 我们只接受 u <= 5
  if math.type(u) ~= "integer" or u > 4
   -- and w >= 0
    or math.type(w) ~= "integer" or w < 0 then
    return
  end
  return LUT[math.max(0, u)][math.min(3, w)]
end

print(lookup(-5, 3))
2022-02-08 16:00:22