我正在查看as3delaunay library,大部分代码对我都很清楚。然而,这部分不是(请注意我在前面加上箭头的行):
public function circles():Vector.<Circle>
{
var circles:Vector.<Circle> = new Vector.<Circle>();
for each (var site:Site in _sites)
{
var radius:Number = 0;
var nearestEdge:Edge = site.nearestEdge();
=======>> !nearestEdge.isPartOfConvexHull() && (radius = nearestEdge.sitesDistance() * 0.5);
circles.push(new Circle(site.x, site.y, radius));
}
return circles;
}
供参考,isPartOfConvexHull()
位于Edge.as
,如下所示:
internal function isPartOfConvexHull():Boolean
{
return (_leftVertex == null || _rightVertex == null);
}
!nearestEdge.isPartOfConvexHull()
做什么?这是否意味着radius = nearestEdge.sitesDistance() * 0.5
仅在调用false
时返回isPartOfConvexHull()
时才会执行?这是否会停止执行任何其他代码?
答案 0 :(得分:5)
相当于:
if (!nearestEdge.isPartOfConvexHull()) {
radius = nearestEdge.sitesDistance() * 0.5;
}
在以下行中:
var b:Boolean = expression1 && expression2;
如果expression2
为expression1
, false
将不会被评估,因为我们已经知道最终结果:b = false
。
现在在以下行中:
expression1 && expression2;
除了我们没有将结果分配给变量之外,同样的事情发生了。
这正是您所询问的行中!nearestEdge.isPartOfConvexHull()
是第一个表达式而(radius = nearestEdge.sitesDistance() * 0.5)
是第二个表达式的行。
答案 1 :(得分:2)
通过一些解释来扩展@sch答案(我不知道编辑答案是否几乎加倍它就可以了。)
这是基于解释器的延迟执行。如果(!nearestEdge.isPartOfConvexHull())为False,那么就不需要执行AND语句的第二部分来知道它将为False,那么它就不会被执行。如果确实需要(然后完成)完整语句的评估,以告知是否该布尔值为True。所以这等同于if语句。
TMHO这是一个糟糕的代码,因为它很简单,很难理解。