2012-03-20 81 views
2

我正在查看as3delaunay library,大部分代码对我来说都很清楚。这部分是不是,但是(请注意,我把前面有箭头的线):Actionscript的这一行是做什么的?

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()做?这是否意味着只有false从呼叫返回isPartOfConvexHull()才会执行radius = nearestEdge.sitesDistance() * 0.5?这会停止执行任何其他代码吗?

回答

5

它等效于:

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

在下面一行:

var b:Boolean = expression1 && expression2; 

expression2会因为我们已经知道最后的结果不会如expression1false评价:b = false

现在在下面一行:

expression1 && expression2; 

发生同样的事情,除了一个事实,即我们不会将结果分配给一个变量。

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

2

为了扩展@sch答案的一些解释(我不知道如果编辑的答案几乎加倍,这是确定的)。

这是基于解释器的惰性执行。如果(!nearestEdge.isPartOfConvexHull())为False,那么就不需要执行AND语句的第二部分来知道它是False,那么它就不会被执行。如果这是真的,则需要(然后完成)完整语句的评估来告知是否这个布尔值为真。所以这相当于一个if语句。

TMHO这是不好的代码,因为它很简单,很难理解。

+0

我已经在编辑我的答案,以进一步解释:) – sch 2012-03-20 00:51:45

+1

有一场围绕着改进SO答案的竞赛;) – AsTeR 2012-03-20 00:53:27

+0

这就是我认为它做的 - 但语法混淆了我,我开始怀疑我的最初印象,并怀疑它以某种方式改变了Edge的参数值。感谢您的澄清! – Clay 2012-03-20 01:02:08