2012-03-20 110 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