Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблема с реализацией класса (http://www.flasher.ru/forum/showthread.php?t=91153)

Madeyra 26.01.2007 01:48

Проблема с реализацией класса
 
Есть следующий код:
Код:

class Vector {
        public var coordinates:Array;
        public function Vector() {
                this.coordinates = this.controllElem(arguments);
        }
        public function dimension():Array {
                var misc = this.coordinates.concat();
                return misc;
        }
        public function length(roundable:Boolean):Number {
                roundable = (roundable == null || !(typeof roundable == "boolean") || !roundable) ? false : true;
                var misc = this.coordinates.concat();
                var summ:Number = 0;
                for (var i in misc) {
                        summ += Math.pow(misc[i], 2);
                }
                return (roundable) ? Math.round(Math.sqrt(summ)) : Math.sqrt(summ);
        }
        private function controllElem(param:Array):Array {
                //if there are more than one element in arguments, return shifted
                var shifter:Array = (param.length != 1) ? param.shift() : param;
                shifter.reverse();
                for (var i in shifter) {
                        //elements can be not a number - in this case just set as 0
                        shifter[i] = isNaN(shifter[i]) ? 0 : shifter[i];
                }
                var reverse = shifter.reverse();
                return reverse;
        }
        public function coord(param:Array) {
                this.coordinates = this.controllElem(arguments);
        }
        public function invert():Vector {
                var __coord = coordinates;
                for (var i in __coord) {
                        __coord[i] *= -1;
                }
                trace(__coord);
                var __vec:Vector = new Vector(__coord);
                trace(__vec.coordinates);       
       
                          return __vec;
        }
}

все хорошо работает за исключением одного:
в выделенном месте создается еще один экземпляр класса,
но проблема в том, что трейсится всегда ноль, хотя по идее должно быть инвертированные координаты вектора. Не могу понять в чем дело...:wacko:

etc 26.01.2007 02:17

Я тоже не могу понять, что значит «создается ещё один экземпляр класса» и «трейсится всегда ноль».

И с какой стати должно быть что-то иное, кроме пустого массива, если у вас в конструкторе нет параметра с массивом координат?

Madeyra 26.01.2007 02:36

попробую вот так объяснить:
метод invert() данного вектора создает еще один вектор у которого каждая координата является числом, равным произведению соответствующей координаты данного вектора на -1.
Код:

var __vec:Vector = new Vector(__coord);
где __сoord - массив с координатами данного вектора
умноженными на -1. И свойство coordinates этого вектора выводится как равным нулю

etc 26.01.2007 02:38

А где происходит обработка полученного в конструкторе массива? У вас — нигде не происходит, конструктор вообще принимает 0 параметров. Зачем юзать arguments там, где не надо?
Впрочем, строка var reverse = shifter.reverse(); меня сильно смущает. Метод reverse возвращает Void, между прочим. И ещё не понимаю смысла в двойном развороте массива.

Madeyra 26.01.2007 02:40

Код:

public function Vector() {
                this.coordinates = this.controllElem(arguments);
        }


vic_ 26.01.2007 02:44

arguments обрабатывает. не совсем читабельно, но почему нет

Madeyra 26.01.2007 02:45

в смысле код не читабельный?

etc 26.01.2007 02:49

В смысле код кривой. Про reverse я уже сказал (во-первых он не нужен, во-вторых если надо получить ничего, то проще return вообще не писать).

Madeyra 26.01.2007 02:55

Код:

если использовать for...in для массива на примере
var a:Array = [1,2,3]
for(i in a) {
    trace(a[i])
}

выводится как 3,2,1 а надо 1,2,3 и поэтому приходится реверс
использовать
что касается return то надо получить новый вектор

etc 26.01.2007 02:57

Зачем надо? for in в обратную сторону не весь массив что-ли обойдет? В данном случае это точно лишнее. Кроме того, метод reverse, повторюсь, возвращает Void. Вникаем. Ищите ошибку, я уже указал, что и где. И пошёл спать.


Часовой пояс GMT +4, время: 23:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.