函数tha通过对与somme成对返回值最终为零

时间:2016-05-10 20:53:06

标签: lua

我尝试制作一个计算圆圈之间交点的函数:圆圈列表中的一个圆圈。

每种情况都有0,1或2个交叉点。

我希望函数返回nil,nil为0,z0,nil为1,z1为z2,z2为2点。我想通过一个循环逐步收集表中的结果对,并在最后解压缩它,但是表没有采用零值。

我暂时试过这个。我怎样才能实现我的目标?

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

2 个答案:

答案 0 :(得分:5)

无法在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机制一起使用来处理数组。你不能在它上面调用#来获得正确的长度,因此迭代它很难除非你知道它是特殊的。删除元素需要它自己的特殊功能,等等。

但是,您可以使用metatable和metamethods来使这种伪数组看起来更具功能性。例如,在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将继续“达到第一个零值”。所以在Lua 5.3中可能无法实现。

因此,除非你处于Lua 5.2或更高版本,manualInsert将创建一个非常不正常的表格。

答案 1 :(得分:2)

如果在表格中使用 nil 会使您的生活变得复杂,请使用其他一些值,例如 false

或者返回类似var result = [{}]; for (i = 0; i < doc.examsubjects.length; i++) { for (var prop in doc.examsubjects[i]) { // Here we repeatedly modify the single // object in our results array result[0][doc.examsubjects[i][prop]] = 0; } } // result now looks like [{"Z4eLrwGwqG4pw4HKX": "0", "fFcWby8ArpboizcT9": 0"}] 的表格。