|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Беседа о нативном итераторе for in
Всем привет! Заболтали мы тут с cleptoman`ом о тщетности всего сущего и задумались вот над чем.
Есть у нас итератор for in. Замечательный, кстати! Но в хэлпе черным по белому сказано, что ключи должны быть String Ну здорово. А ещё у нас есть такой класс-коллекция Dictionary, в него в качестве ключей можно совать даже не String`и. var timer:Timer=new Timer(1000); var hash:Dictionary=new Dictionary(); hash[timer]="bingo!"; for (var name:String in hash){ trace(hash[name]); //undefined } На самом деле оказалось, что этот засранец всеми силами пытается сделать из ключа String. Например, функцией String или методом toString, но это, по-сути, одно и то же. А ещё мы знаем о том, что в качестве ключа мы можем использовать Object. Этакая недокументированная фича. Во всяком случае, я сейчас говорю так: ранее я думал чуть иначе. Например, ожидая DisplayObject мы можем передать MovieClip. Такой подход называется сужением — сузили функционал MovieClip до DisplayObject. И вот когда я не думал об этом, я думал что аналогичный функционал работает и там: просто передали Object (ведь String extends Object), далее происходит конвертирование объекта в Object (как ранее в String) и всё хорошо. Но нет, ошибка. Мне поначалу было трудно её осмыслить (почему — не знаю). Приведу на примере: SimpleButton extends DisplayObject (в конечном итоге). String extends Object. Ожидая SimpleButton мы НЕ можем передать DisplayObject. Ожидая String мы НЕ можем передать Object. Но передаем ведь... а как? А так сложилось, что Object это базовый тип во флеше вообще. Причем он динамический. Проще говоря, допустимо читать Object как "нетипизирован". Но есть и другая форма записи "нетпизировано" — это :*. И это нормально работает в качестве типа ключа для for-in. Ну что здесь сказать, много написано, а в принципе ни о чем. Захотелось поделиться, почему-то, а в блог такую чушь постить стыдно. Мои домыслы в том, что for-in для name:String и name:Object — это разные итераторы.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
.
|
Напомните, итерировать Dictionary нельзя?
Добавлено через 19 минут Это классический случай восходящего приведения. Последний раз редактировалось dimarik; 01.03.2011 в 00:31. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
Цитата:
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Цитата:
|
|
|||||
да, с * или Object в качестве типа ключа все хорошо..но если поставить реальный тип ключа - RTE с тем что он не может String (!откуда он вообще тут??)сконвертить в нужный тип.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Не RTE, а ошибка компиляции.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
ну да
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
.
|
Честно скажу, что Dictionary никогда не использовал в своих разработках. Скорее всего даже возникла антипатия на почве массового быдлокода с использованием Dictionary. Хотя, как инструмент, наверняка он может быть где-нибудь полезен. Спасибо за примеры ).
|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
А как ты делал, когда тебе надо было перебросить какое-нибудь значение с объектом? (ну, например внутрифизический id экземпляра кнопки при клике, если обработчик для кучи кнопок один)? Создавал наследника или проверял в цикле на все возможные значения? Последний вариант куда более быдлокодерский.
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 20:51. |
|
« Предыдущая тема | Следующая тема » |
|
|