User's collector

Внимание!   Данная опция будет доступна только после того, как вы авторизуетесь.
   запомнить меня 
29 октября 2008

Создание экземпляра Vector с заранее определенным содержимым

Предлагаю нам продолжить разговор о тонкостях работы с классом Vector, начатый ранее в этой статье.

В ходе перевода некоторых классов разрабатываемого мною в том числе приложения на использование класса Vector, возник вопрос: «Каким образом можно наполнять экземпляр вектора нужными нам элементами при его создании?».

В случае использования массива это делается достаточно просто. Можно прибегнуть к конструктору массива:

Actionscript:
  1. var rows:Array = new Array(new Row(0, 25), new Row(183, 3));

либо же к литералу:

Actionscript:
  1. var rows:Array = [new Row(0, 25), new Row(183, 3)];

У конструктора класса Vector есть всего два строго фиксированных параметра: первый указывает длину создаваемого экземпляра, второй отвечает за то, возможно ли изменение длины вектора со временем. Поэтому передать нужные нам элементы в конструктор класса Vector у нас не получится. Литерала вектора не существует. Обратившись к документации по этому классу, максимум, что мы можем найти — это метод concat(...args):Vector.<T>, присоединяющий переданные аргументы к объекту. Т.е. следующий код:

Actionscript:
  1. var rows:Vector.<Row> = new Vector.<Row>();
  2. rows.push(new Row(0, 25));
  3. rows.push(new Row(183, 3));

может превратиться в:

Actionscript:
  1. var rows:Vector.<Row> = new Vector.<Row>().concat(new Row(0, 25), new Row(183, 3));

Однако если взглянуть на документацию более внимательно, то мы можем найти там глобальную функцию Vector, принимающую в качестве параметра исходный массив или вектор, элементы которого будут являться элементами будущего вектора, и возвращающую этот новый вектор. Синтаксис этой функции в точности повторяет синтаксис конструктора класса Vector, однако оператор new в этом случае использовать не нужно. И наш код превращается в следующий красивый и краткий кусок кода:

Actionscript:
  1. var rows:Vector.<Row> = Vector.<Row>([new Row(0, 25), new Row(183, 3)]);

Вот такие тонкости. Удачного вам программирования!

См. также:

Теги:


9 комментариев к записи:

[...] «Создание экземпляра Vector с заранее определенным содерж...» [...]

Slon_vsapogah [ 29 октября , 2008 в 15:42 ]

Вот ты разошелся :) Месяц ничего не писал и вдруг каждый день по несколько постов.

Оффтоп: почему-то вспомнилась фраза "встречные социалистические обязательства" :)

Юрий Яровой [ 29 октября , 2008 в 15:49 ]

Пытаюсь быть активным — сопротивляюсь приближающейся зиме. ;-)
А если серьезно, то просто в последнее время появляется куча разных интересных событий и новшеств. Только успевай их записывать: выход десятки, бурно развивающийся четвертый флекс. Черт, столько всего еще успеть нужно...

Anton Volkov [ 29 октября , 2008 в 17:00 ]

Есть подозрение, что такой способ конструирования подразумевает передачу массива в конструктор Vector, где он поэлементно будет добавлен. Думаю, это может быть не эффективно - лишний экземпляр массива, его наполнение, перенос элементов в Vector.

Предлагаю сделать стресс-тесты на различные варианты наполнения Vector с результатами в ms.

Юрий Яровой [ 29 октября , 2008 в 19:19 ]

Есть подозрение, что такой способ конструирования подразумевает передачу массива в конструктор Vector, где он поэлементно будет добавлен. Думаю, это может быть не эффективно - лишний экземпляр массива, его наполнение, перенос элементов в Vector.

Предлагаю сделать стресс-тесты на различные варианты наполнения Vector с результатами в ms.

Сразу видно, что человек печется о каждой миллисекунде процессорного времени. :-)

Мне кажется, если нужно наполнить вектор небольшим количеством заранее известных элементов, вроде нескольких объектов строк, приведенных выше в коде, то тут будет проще воспользоваться функцией Vector. Если же количество элементов исчисляется пятью, десятью и больше, то конечно же целесообразней будет наполнить вектор при помощи цикла.

Smirnoff [ 9 июня , 2009 в 10:28 ]
Actionscript:
  1. var smiles:Vector.<String> = new Vector.<String>([':)', ';)', ':-D'])
  2. trace('smiles.length = ' + smiles.length);

//Вывел: smiles.length = 0

Что-то не так сделал?

Smirnoff [ 9 июня , 2009 в 10:30 ]

Тфу,

Actionscript:
  1. new

не надо. :(

Smirnoff [ 9 июня , 2009 в 14:40 ]

Наконец-то нашел баг у Vector(sdk 4). Если создавать в основном классе internal класс, и в нем же делать Vector., то при выполнении кода(вызов метода основного класса, при инициализации класса) происходит падение.Пришлось internal делать обычным классом :(

k0zer [ 10 июня , 2009 в 13:15 ]

Классы-хелперы вообще зло.
Очень нужный функционал, но реализован сильно кастрированным и глубоко через задницу, не нужно их использовать.

Оставьте свой комментарий:

Имя: *
* — обязательно для заполнения
Электропочта: *
Сайт:
Сообщение *
Коментировать
Коментировать