PDA

Просмотр полной версии : Проблема с реализацией класса


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. Вникаем (http://livedocs.macromedia.com/flash/8/main/00001912.html). Ищите ошибку, я уже указал, что и где. И пошёл спать.

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

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