Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 28.02.2011, 23:47
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 1  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
По умолчанию Беседа о нативном итераторе for in

Всем привет! Заболтали мы тут с cleptoman`ом о тщетности всего сущего и задумались вот над чем.
Есть у нас итератор for in. Замечательный, кстати! Но в хэлпе черным по белому сказано, что ключи должны быть String
Код AS3:
for (var name:String in object) {
}
Ну здорово. А ещё у нас есть такой класс-коллекция Dictionary, в него в качестве ключей можно совать даже не String`и.
Код AS3:
var timer:Timer=new Timer(1000);
var hash:Dictionary=new Dictionary();
hash[timer]="bingo!";
for (var name:String in hash){
trace(hash[name]); //undefined
}
Почему? Ну, все дружно скажут: "потому что name это Timer, а мы идём по String`ам". А сможете так же дружно ответить, почему же если мы "итерируем" по String то всё равно вошли в выполнение блока кода внутри итератора?
На самом деле оказалось, что этот засранец всеми силами пытается сделать из ключа 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 — это разные итераторы.

Создать новую тему   Часовой пояс GMT +4, время: 02:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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