Форум 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. Вникаем. Ищите ошибку, я уже указал, что и где. И пошёл спать.

vic_ 26.01.2007 02:59

функция controllElem(param:Array)
уже после строчки
var shifter:Array = (param.length != 1) ? param.shift() : param;
массив трейсится как ноль

Madeyra 26.01.2007 03:11

На том же сайте:
Цитата:

mbd said on Feb 15, 2006 at 10:35 AM :
The Void return definition is incorrect. The reverse method actually returns the Array in question. This also includes the class file, which indicates Void, yet it REALLY does return the Array.
он прав:
Код:

var g:Array = [1,2,3]
var w = g.reverse()
trace(w instanceof Array) //true

с реверсом проблем нет так в противном случае была бы

Цитата:

The expression returned must match the function's return type.

Madeyra 26.01.2007 03:19

Цитата:

Сообщение от vic_
функция controllElem(param:Array)
уже после строчки
var shifter:Array = (param.length != 1) ? param.shift() : param;
массив трейсится как ноль

не понял после какой строчки

vic_ 26.01.2007 03:23

Код:

class Vector {
        public var coordinates:Array;
        public function Vector(arr:Array) {
                this.coordinates = this.controllElem(arr);
        }
        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(param.length != 1)param.shift();
                var total:Number=param.length;
                var shifter:Array = [];
                for(var i:Number=0;i<total;i++){
                        shifter[i] = isNaN(param[i]) ? 0 : param[i];
                }
                return shifter;
        }
        public function coord(param:Array) {
                this.coordinates = this.controllElem(arguments);
        }
        public function invert():Vector {
                var __coord:Array=[];
                for (var i:Number=0;i<coordinates.length;i++) {
                        __coord[i] = -1*coordinates[i];
                }
                var __vec:Vector = new Vector(__coord);               
                trace(__vec.coordinates);       
        return __vec;
        }
}

работает правильно?

Madeyra 26.01.2007 10:48

неа. нужно чтобы свойство coodinates возвращало первый элемент arguments. т.е. массив, но в этом случае оно возвращает этот массив без первого элемента

Madeyra 26.01.2007 11:48

решил. функцию controllElem() переделал таким образом:
Код:

private function controllElem(param:Array):Array {
                var __len = param[0].length;
                for (var i = 0; i < __len; i++) {
                        if (isNaN(param[0][i])) {
                                param[0][i] = 0;
                        }
                }
                return param[0];
        }

спасибо vic_ и __etc за помощь

vic_ 26.01.2007 11:53

ну так убрать shift, я думал так нужно по ходу задачи

etc 26.01.2007 11:53

У меня есть большое подозрение, что ты усложняешь задачу какими-то ненужными циклами, шифтами, реверсами…

Madeyra 27.01.2007 01:25

Цитата:

Сообщение от __etc
У меня есть большое подозрение, что ты усложняешь задачу какими-то ненужными циклами, шифтами, реверсами…

а что делать - пока что называется учусь. одно дело когда человек занимается уже пятый год а совсем другое когда всего 7 месяцев.
может со временем приду к более правильному решению задач.
запустался в том, что один метод класса Array возвращает Array, другой Object, третий Void, еще String и Number. Мультикласс такой...:D


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

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