Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   toString Vector (http://www.flasher.ru/forum/showthread.php?t=197504)

rs7 08.04.2013 14:12

toString Vector
 
Можно ли как-то определить toString у Vector?

Vector.prototype.toString не прокатывает

strangedk 08.04.2013 14:14

Вроде проще так

Код AS3:

for each (var item:Object in myVector)
    trace(item.toString());


rs7 08.04.2013 14:33

Цитата:

Сообщение от strangedk (Сообщение 1128789)
Вроде проще так

Не, мне для всех сразу.

strangedk 08.04.2013 14:39

Переопределите у каждого объекта его toString, и вызывайте потом встроенный toString у вектора

Код AS3:

// MyClass.as
override public function toString():String {
        return this.name;
}

Код AS3:

// Main.as
public var objs:Vector.<MyClass> = new Vector.<MyClass>();
 
public function init():void
{
        for (var i:int = 0; i < 10; ++i)
        {
                var item:MyClass = new MyClass();
                item.name = "myName(" + i + ")";
                objs.push(item);
        }
 
        trace(objs.toString());
}


Александр Мостовой 08.04.2013 15:23

Можно сделать через Proxy наследника, но интересно бы узнать зачем?
Единственным полезным примененим таких переопределений я бы посчитал развер рассылку событий об обновлении данных, а для toString, почему неудобно просто использовать статическую утилиту MyUtils.vectorToString(value:Vector.<*>); ?

Вот например наследник от Vector.<Point>. Сохраняяет все мотоды Vector, но переопределяет toString;
МОжно подумать еще над передачей типа.

Код AS3:

package {
        import flash.display.Sprite;
        import flash.geom.Point;
 
        public class ProxyExample extends Sprite
        {
                public function ProxyExample()
                {
                        var vector:ProxyVector = new ProxyVector();
                        vector.push(new Point(Math.random(), Math.random()));
                        vector.push(new Point(Math.random(), Math.random()));
                        vector.push(new Point(Math.random(), Math.random()));
                        vector.push(new Point(Math.random(), Math.random()));
                        vector.push(new Point(Math.random(), Math.random()));
 
                        trace(vector.length);//Методы Vector сохранились
                        trace(vector.toString());
                        /*Выводит :
                        item [0] = (x=0.5526889930479228, y=0.4928265390917659)
                        item [1] = (x=0.007704821415245533, y=0.5104764206334949)
                        item [2] = (x=0.5938579649664462, y=0.913416794501245)
                        item [3] = (x=0.19566342374309897, y=0.6506094681099057)
                        item [4] = (x=0.4772168640047312, y=0.5084680668078363) */

 
 
                }
        }
}
import flash.geom.Point;
import flash.utils.Proxy;
import flash.utils.flash_proxy;
 
dynamic class ProxyVector extends Proxy {
        private var _item:Vector.<Point>;
 
        public function ProxyVector() {
                _item = new Vector.<Point>();
        }
 
        override flash_proxy function callProperty(methodName:*, ... args):* {
                var res:*;
                if (methodName.toString() == 'toString')
                {
                        var output:String = "";
                        var len:uint = _item.length;
                        for (var i:uint = 0; i < len; i++)
                        {
                                output += 'item [' + String(i) + '] = ' + _item[i].toString() + "\n";
                        }
                        res = output;
                }
                else
                {
                        var _itemObj:Object = _item as Object;
                        res = _itemObj[methodName].apply(_item, args);
                }
                return res;
        }
 
        override flash_proxy function getProperty(name:*):* {
                return _item[name];
        }
 
        override flash_proxy function setProperty(name:*, value:*):void {
                _item[name] = value;
        }
}



Мне кажется лучше просто завернуть его в обертку, и обращаться просто на точку длиннее vectorCont.item[i];


Прикольно как в разных языках по разному происходит эволюция, то от чего в AS с трудом избавились, в других языках воспринимают за достижение.
Или прикольно было набдюдать как СилверЛайтчики гордились тем что у них компонент на векторах, хотя без строкхинтинга с небрежно размазанными шрифтами, а во флеше очень радовлись когда появилась возможность работы с bitmapData вместо вектора :)

strangedk 08.04.2013 15:31

Вопрос к rs7 - что вы хотите получить на выходе из toString у вектора ?


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

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