Форум 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
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 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 — это разные итераторы.

Старый 28.02.2011, 23:59
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Ни что не идеально в этом мире, даже на солнце есть пятна

Старый 01.03.2011, 00:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Напомните, итерировать Dictionary нельзя?

Добавлено через 19 минут
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Например, ожидая DisplayObject мы можем передать MovieClip. Такой подход называется сужением — сузили функционал MovieClip до DisplayObject.
Это классический случай восходящего приведения.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 01.03.2011 в 00:31.
Старый 01.03.2011, 00:50
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Напомните, итерировать Dictionary нельзя?
Можно, почему нет?
Цитата:
Это классический случай восходящего приведения.
Даже так )

Старый 01.03.2011, 00:55
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Напомните, итерировать Dictionary нельзя?
Хоть тут вроде как и написано, продублирую в коде, на всякий случай:
Код AS3:
for (var key:* in dictionary)
{
    var typedKey:MyKeyType = key;
    var value:MyType = dictionary[typedKey];//или dictionary[key];
}
// Если ключ не нужен:
for each (var value:MyType in dictionary)
{
    //...
}

Старый 01.03.2011, 08:56
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 6  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
да, с * или Object в качестве типа ключа все хорошо..но если поставить реальный тип ключа - RTE с тем что он не может String (!откуда он вообще тут??)сконвертить в нужный тип.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 01.03.2011, 17:32
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Не RTE, а ошибка компиляции.

Старый 01.03.2011, 18:08
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 8  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
ну да
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 01.03.2011, 21:20
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Честно скажу, что Dictionary никогда не использовал в своих разработках. Скорее всего даже возникла антипатия на почве массового быдлокода с использованием Dictionary. Хотя, как инструмент, наверняка он может быть где-нибудь полезен. Спасибо за примеры ).
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 01.03.2011, 21:55
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
А как ты делал, когда тебе надо было перебросить какое-нибудь значение с объектом? (ну, например внутрифизический id экземпляра кнопки при клике, если обработчик для кучи кнопок один)? Создавал наследника или проверял в цикле на все возможные значения? Последний вариант куда более быдлокодерский.

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

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

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


 


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


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