Что делает эта строка Actionscript? - PullRequest
2 голосов
/ 20 марта 2012

Я смотрю на библиотеку as3delaunay , и большая часть кода мне понятна.Однако этой части нет (обратите внимание на строку, которую я поставил перед стрелкой):

    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 ]

5 голосов
/ 20 марта 2012

Это эквивалентно:

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) является вторым выражением.

2 голосов
/ 20 марта 2012

Расширение ответа @sch с некоторыми пояснениями (я не знал, было ли это нормально, если редактировать ответ почти вдвое).

Это основано на ленивом исполнении переводчика. Если (! NearEdge.isPartOfConvexHull ()) имеет значение False, то нет необходимости выполнять вторую часть оператора AND, чтобы знать, что это будет False, тогда он не выполняется. Если это правда, оценка полного утверждения необходима (и затем сделана), чтобы сказать, является ли этот логический параметр Истиной. Так что это эквивалентно утверждению if.

ТМХО, это плохой код, потому что он очень сжатый и трудный для понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...