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

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

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

Регистрация: Jan 2012
Адрес: (0;0;0) относительно меня
Сообщений: 82
Отправить сообщение для am_devcorp с помощью Skype™
По умолчанию Общий вопрос про повторные определения

Вот допустим, есть у нас код.
Код AS3:
switch (dir) {
                case TOP:
                    var i:int = 0
                    for (var j:int = 0; j < pics[0].length; j++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
 
                case RIGHT:
                    var j:int = pics[0].length - 1
                    for (var i:int = 0; i < pics.length; i++) {
                        что-то делаем с pics[i][j]
                    }
 
                    break;
                case BOT:
                    var i:int = pics.length - 1
                    for (var j:int = 0; j < pics[0].length; j++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
                case LEFT:
                    var j:int = 0
                    for (var i:int = 0; i < pics.length; i++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
                default:
            }
т.е. мы в зависимости от dir по разному проходим по матрице.
Вообще подробности не важны, может мы несколько раз по разному проходимся по матрице, не суть, главное, что подряд идут несколько похожих по смыслу циклов с i и опционально j. В таком случае компилятор сыпет в консоль ворнинги duplicate variable definition. Но щит, Шерлок, это я и сам вижу, но как лучше от них избавляться?

Вариант 1) Забить, но это несолидно, когда проект собирается не молча.
Вариант 2) В начале объявить эти злосчастные i и j и убрать объявления. Но может это мои тараканы мне это тоже не нравится, ибо это вроде как повторное использование переменной в другом месте, что не есть хорошо.

Есть ли какие-нибудь еще кроме (2) практики исправления таких ситуаций?
__________________
cats are supreme beings

Старый 10.10.2013, 23:22
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Только один вариант - обьявить i перед заходом в switch
Можно i=0 вообще убрать из цикла, но так будет не красиво.
Немного я упустил Ваш код)) ещё j добавить и делать в таком же духе.

Добавлено через 2 минуты
Код AS3:
var i:int;
var j:int;
switch (dir) {
                case TOP:
                    for (i=0; i < pics[0].length; j++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
 
                case RIGHT:
                    for (i=0; i < pics.length; i++) {
                        что-то делаем с pics[i][j]
                    }
 
                    break;
                case BOT:
                    for (i=0; i < pics[0].length; j++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
                case LEFT:
                    for (i=0; i < pics.length; i++) {
                        что-то делаем с pics[i][j]
                    }
                    break;
                default:
            }

Старый 10.10.2013, 23:25
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 3  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Объявить в самом начали, а потом уже присваивать им значения?

Старый 10.10.2013, 23:25
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 4  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
правильнее всё таки писать var в цикле.

Добавлено через 33 секунды
Bletraut, да дурдом

Старый 10.10.2013, 23:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Bletraut, да дурдом
А почему инициализация вне цикла - дурдом?

Старый 10.10.2013, 23:38
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 6  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Какой в ней смысл? переменная, что где-то перед циклом используется?

Старый 10.10.2013, 23:45
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 7  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Ну и, если на то пошло, обращение к геттеру length происходит каждый виток цикла, кэшируйте значение. Конструкция вида "i < pics[0].length" плоха еще тем, что нулевой элемент берется тоже каждую итерацию. Кэшировать нужно и это.
__________________
тут я

Старый 10.10.2013, 23:45
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 8  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Какой в ней смысл? переменная, что где-то перед циклом используется?
я конечно не могу спорить, но мне кажется, что переменная вне цикла, это как приватная переменная для класса...
Так ведь работает..
Код AS3:
var i:int;
for (i = 0; i < 10; i++) 
{
	trace(i);
}
for (i = 0; i < 10; i++) 
{
	trace(i);
}

Старый 10.10.2013, 23:47
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 9  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Все локальные переменные метода находятся в одном скоупе, вне зависимости, где они они были объявлены. Если это не переменные вложенной функции, она не расширяет родительский скоуп, но содержит его в себе. Компилятор все равно все переменные, где бы они не объявлялись, затолкает в хидер метода, плюс уберет повторное определение, если таковое имеется, и ругнется ворнингом.
__________________
тут я

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Вариант 1) Забить, но это несолидно, когда проект собирается не молча.
Вынести объявления вверх как общие и смириться
Если смириться тяжело - в опциях mxmlc есть галочка - не выдавать ворнинги про дублирование переменных (проверять порядок объявления и область видимости, правда, компилятор не будет что так, что так - просто флудить не будет)
Насколько опасно отключать? Ну случалось, внутри блока объявлял переменную, думая что её нет снаружи и узнавал это из ворнинга.
С другой стороны отключать/не отключать - это мёртвому припарки. Когда у тебя половину переменных надо искать на полэкрана выше и не понятно где ты их собирался использовать, а где - нет, и когда компилятор даже не проверяет, объявлена ли переменная до её использования.

Сильный аргумент _не_ отключать: не пугать людей, которые так или иначе будут компилировать ваш код - по умолчанию то предупреждения включены
Цитата:
Вариант 2) В начале объявить эти злосчастные i и j и убрать объявления. Но может это мои тараканы мне это тоже не нравится, ибо это вроде как повторное использование переменной в другом месте, что не есть хорошо.
Вы правы, это отвратительно, и такое поведение в стандарт ECMA вписал какой-то негодяй
Но есть хорошая новость: во многих других языках область видимости переменных ограничена блоком, а не методом (Java, C#, haXe, F#, Ocaml, C++)


Последний раз редактировалось expl; 11.10.2013 в 00:50.
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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