我尝试制作一个计算圆圈之间交点的函数:圆圈列表中的一个圆圈。
每种情况都有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
答案 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"}]
的表格。