这行Actionscript有什么作用?

时间:2012-03-20 00:39:33

标签: actionscript-3

我正在查看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()时才会执行?这是否会停止执行任何其他代码?

2 个答案:

答案 0 :(得分:5)

相当于:

if (!nearestEdge.isPartOfConvexHull()) {
    radius = nearestEdge.sitesDistance() * 0.5;
}

在以下行中:

var b:Boolean = expression1 && expression2;
如果expression2expression1

false将不会被评估,因为我们已经知道最终结果:b = false

现在在以下行中:

expression1 && expression2;

除了我们没有将结果分配给变量之外,同样的事情发生了。

这正是您所询问的行中!nearestEdge.isPartOfConvexHull()是第一个表达式而(radius = nearestEdge.sitesDistance() * 0.5)是第二个表达式的行。

答案 1 :(得分:2)

通过一些解释来扩展@sch答案(我不知道编辑答案是否几乎加倍它就可以了。)

这是基于解释器的延迟执行。如果(!nearestEdge.isPartOfConvexHull())为False,那么就不需要执行AND语句的第二部分来知道它将为False,那么它就不会被执行。如果确实需要(然后完成)完整语句的评估,以告知是否该布尔值为True。所以这等同于if语句。

TMHO这是一个糟糕的代码,因为它很简单,很难理解。