当前位置: 首页 > 知识库问答 >
问题:

Lua:为什么这个代码不能产生正确的结果?嵌套表

宿衡虑
2023-03-14
local tbmoffsets = {}
local facedir = {}
local row = {}
local height = 10
local widthl = -5
local widthr = 5
local depth = 3



            Z1=1
            for Y1 = height, -1,-1 do
                for X1 = widthl,widthr do
                  row[#row + 1] = {X = X1, Y = Y1, Z = Z1}
                end 
             --facedir[Y1]=row
            end
           for m = height,-1,-1 do 
            for n = 1,#row do 
             o = row[n].Y
             if o == m then
              print(o)
              facedir[o] = row[n]
             end
            end 
           end
tbmoffsets[1] = facedir

为什么这段代码不生成这样的表;

1
 1
  1
    X=-1    Z=1     Y=2
  2
    X=0     Z=1     Y=2
  3
    X=1     Z=1     Y=2
 2
  1
    X=-1    Z=1     Y=1
  2
    X=0     Z=1     Y=1
  3
    X=1     Z=1     Y=1
 3
  1
    X=-1    Z=1     Y=0
  2
    X=0     Z=1     Y=0
  3
    X=1     Z=1     Y=0

你会注意到,我想要的格式把所有类似的Y变量在那里自己的块(表)和当我读代码在我的脑海中它应该这样做,但没有这样的运气对我来说,3天与这微不足道的11行代码和我已经尝试了十几个或更多的变化相同的代码和无论我做什么它总是搞砸了这个当前版本产生的结果组合在一起只有X值=5然后噗丢弃所有的其余数据

以上代码的结果:

1: 
  1: 
    X: 5
    Y: 1
    Z: 1
  2: 
    X: 5
    Y: 2
    Z: 1
  3: 
    X: 5
    Y: 3
    Z: 1
  4: 
    X: 5
    Y: 4
    Z: 1
  5: 
    X: 5
    Y: 5
    Z: 1
  6: 
    X: 5
    Y: 6
    Z: 1
  7: 
    X: 5
    Y: 7
    Z: 1
  8: 
    X: 5
    Y: 8
    Z: 1
  9: 
    X: 5
    Y: 9
    Z: 1
  10: 
    X: 5
    Y: 10
    Z: 1
  0: 
    X: 5
    Y: 0
    Z: 1
  -1: 
    X: 5
    Y: -1
    Z: 1

共有1个答案

双恩
2023-03-14

如果你更换

   for m = height,-1,-1 do 
    for n = 1,#row do 
     o = row[n].Y
     if o == m then
      print(o)
      facedir[o] = row[n]
     end
    end 
   end

具有

   for m = height,-1,-1 do
    for n = 1,#row do
     o = row[n].Y
     if o == m then
      if not facedir[o] then
          facedir[o] = {}
      end
      local t = facedir[o]
      t[#t + 1] = row[n]
     end
    end
   end

然后你得到的价值观更像你想要的,我相信。不过,如果您创建独立的row表,而不是像下面这样创建一个巨大的row表,则可以完全避免第二个循环

local tbmoffsets = {}
local facedir = {}
local height = 10
local widthl = -5
local widthr = 5
local depth = 3

local Z1=1
for Y1 = height, -1,-1 do
    local row = {}
    for X1 = widthl,widthr do
        row[#row + 1] = {X = X1, Y = Y1, Z = Z1}
    end
    facedir[Y1]=row
end

tbmoffsets[1] = facedir
 类似资料:
  • 问题内容: 范例1: 输出为: 范例2: 输出: 我只是不明白为什么将saySomething设为非静态会导致第二次调用saySomething调用Cow版本而不是Animal版本。我的理解是, 这两种情况都是输出。 问题答案: 静态方法在编译时绑定到其类,并且不能多态使用。在Animal上声明“静态”方法时,该方法永远绑定到Animal类,并且不能被覆盖。静态方法绑定到Class对象,而不是Cl

  • 当我发现这个奇怪的东西时,我正在玩JSX。使用以下JSX: 会产生正确的结果: 但我想在引号周围添加双引号,因此我尝试: 令我惊讶的是,它给出了正确的输出: 我希望得到类似的输出,因为它是字符串文字: 既然在字符串文本中,它为什么不按字面意思告诉我?这是巴贝尔的错误吗? 注意:这是一个自我提问和回答

  • 我试图做一个函数,返回数组的长度,但函数总是返回8

  • 问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要

  • 考虑以下数据框架: 这就产生了: 我希望按类分组,如果每个组包含两个成员,然后从中减去1,如果,否则,从中减去该组中最小值...如果每个组不包含两个成员,那么我们从中减去零。 使用包执行上述操作的代码可以使用以下表达式表示: 但是,这会产生不正确的结果,其中第二个始终解析为第一个条件: 如果没有第一条语句,则可以生成正确的结果。 生产: 通过检查成功完成类似工作的其他代码片段,我们可以看到这个问题