编写一个带有一些可能是 nil 的值对的函数

我尝试编写一个函数,计算一个圆与一个圆列表之间的交点。

每种情况下都可能有0、1或2个交点。

我想让函数对于0个点返回 nil,nil,对于1个点返回 z0,nil,对于2个点返回 z1,z2。我想通过循环逐步收集结果对的方式将结果对收集到一个表中,最终再将其展开,但是表不接受 nil 值。

我目前尝试了这种方式。我该如何实现我想要的?

function InterSection_Cercles (Ca , ... )

    local C = table.pack( ... )
    local d, CosTheta, Theta, i
    local t = {}

    for i = 1, C.n do

        d = complex.abs ( Ca.Ct - C[i].Ct )

        CosTheta = round (((Ca.Ry * Ca.Ry + d * d - C[i].Ry * C[i].Ry) /( 2 * Ca.Ry * d )) , 10 )

        Theta = round ( math.acos( CosTheta ) , Prec)

        if not Theta then -- 0 solution
            -- table.insert( t , nil ) useless
            -- table.insert( t , nil )
        elseif Theta == 0 then -- 1 solution
            table.insert( t , Ca.Ct + complex.polar (Ca.Ry , Theta + complex.arg (C[i].Ct -Ca.Ct)))
            -- table.insert( t , nil ) useless
        else -- 2 solitions
            table.insert( t , Ca.Ct + complex.polar (Ca.Ry , Theta + complex.arg (C[i].Ct -Ca.Ct)))
            table.insert( t , Ca.Ct + complex.polar (Ca.Ry , -Theta + complex.arg (C[i].Ct -Ca.Ct)))
        end -- if

    end -- for

    return table.unpack ( t )

end -- function
点赞
用户734069
用户734069

在 Lua 中无法构建包含 nil 值的数组。Lua 中的数组是指在表中从 [1, n] 的序列,其中不含有 nil 值的序列。

你可以插入一个占位符值(false),或者你必须手动跟踪表的大小。因此,你必须编写一个新的函数来存储表的长度,而不是调用 table.insert

local function manualInsert(tbl, val)
  if(not tbl.n) then tbl.n = 0 end --all values are assumed to be inserted through this function.
  tbl[tbl.n + 1] = val
  tbl.n = tbl.n + 1
end

通常,tbl 无法与标准的 Lua 机制一起使用来处理数组。你不能对它调用 # 获取正确的长度,因此很难迭代它,除非你知道它的特殊性质。删除元素需要自己编写特殊的函数,等等。

但是,你可以使用元表和元方法使使用这种假数组看起来更加功能齐全。例如,在 Lua 5.2+ 中,你可以重写 __len 元方法以返回 n。这将允许你使用 for i = 1, #tbl do 迭代元素。如果没有手动传递长度,它还将允许 table.unpack 工作,因为如果不提供长度,它是使用 # 来获取长度的。

请注意,虽然 Lua 5.1 允许使用 __len 元方法,但它不允许 覆盖默认长度计算。它只使用 userdata 的 __len 元方法。

在 Lua 5.2 中,您可以重写 __ipairs 元方法以使 ipairs 工作。在 Lua 5.3 中,这已被弃用; ipairs 依靠标准元方法。这可能是可行的,但文档表示 ipairs 将继续循环“直到第一个 nil 值”。因此,在 Lua 5.3 中可能无法这样做。

因此,除非你在 Lua 5.2 或更高版本,否则 manualInsert 将创建一个非常难以使用的表。

2016-05-10 21:37:30
用户107090
用户107090

如果在表格中使用 nil 会让你感到困扰,可以使用一些其他的值,比如 _false_。

或者返回一个类似 { 0, 1, z1, 2, z1, z2 } 的表格。

2016-05-10 23:57:27