Просмотр полной версии : Проблема с реализацией класса
Есть следующий код:
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:
Я тоже не могу понять, что значит «создается ещё один экземпляр класса» и «трейсится всегда ноль».
И с какой стати должно быть что-то иное, кроме пустого массива, если у вас в конструкторе нет параметра с массивом координат?
попробую вот так объяснить:
метод invert() данного вектора создает еще один вектор у которого каждая координата является числом, равным произведению соответствующей координаты данного вектора на -1.
var __vec:Vector = new Vector(__coord);
где __сoord - массив с координатами данного вектора
умноженными на -1. И свойство coordinates этого вектора выводится как равным нулю
А где происходит обработка полученного в конструкторе массива? У вас — нигде не происходит, конструктор вообще принимает 0 параметров. Зачем юзать arguments там, где не надо?
Впрочем, строка var reverse = shifter.reverse(); меня сильно смущает. Метод reverse возвращает Void, между прочим. И ещё не понимаю смысла в двойном развороте массива.
public function Vector() {
this.coordinates = this.controllElem(arguments);
}
arguments обрабатывает. не совсем читабельно, но почему нет
в смысле код не читабельный?
В смысле код кривой. Про reverse я уже сказал (во-первых он не нужен, во-вторых если надо получить ничего, то проще return вообще не писать).
если использовать for...in для массива на примере
var a:Array = [1,2,3]
for(i in a) {
trace(a[i])
}выводится как 3,2,1 а надо 1,2,3 и поэтому приходится реверс
использовать
что касается return то надо получить новый вектор
Зачем надо? for in в обратную сторону не весь массив что-ли обойдет? В данном случае это точно лишнее. Кроме того, метод reverse, повторюсь, возвращает Void. Вникаем (http://livedocs.macromedia.com/flash/8/main/00001912.html). Ищите ошибку, я уже указал, что и где. И пошёл спать.
функция controllElem(param:Array)
уже после строчки
var shifter:Array = (param.length != 1) ? param.shift() : param;
массив трейсится как ноль
На том же сайте:
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.
функция controllElem(param:Array)
уже после строчки
var shifter:Array = (param.length != 1) ? param.shift() : param;
массив трейсится как ноль
не понял после какой строчки
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;
}
}
работает правильно?
неа. нужно чтобы свойство coodinates возвращало первый элемент arguments. т.е. массив, но в этом случае оно возвращает этот массив без первого элемента
решил. функцию 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 за помощь
ну так убрать shift, я думал так нужно по ходу задачи
У меня есть большое подозрение, что ты усложняешь задачу какими-то ненужными циклами, шифтами, реверсами…
У меня есть большое подозрение, что ты усложняешь задачу какими-то ненужными циклами, шифтами, реверсами…
а что делать - пока что называется учусь. одно дело когда человек занимается уже пятый год а совсем другое когда всего 7 месяцев.
может со временем приду к более правильному решению задач.
запустался в том, что один метод класса Array возвращает Array, другой Object, третий Void, еще String и Number. Мультикласс такой...:D
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.