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

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

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

Регистрация: Apr 2010
Сообщений: 34
По умолчанию Константная переменная изменяется при работе приложения

Не пойму логику поведения программы.

Код AS3:
package engines
{
	public class PlacingShipsByPlayer
	{
		private var left_to_add:Array = ["", 4, 3, 2, 1]; 
		private static const left_to_addDefault:Array = ["", 4, 3, 2, 1];
 
 
 
		private function makeDefaultState():void
		{
			...
			left_to_add = left_to_addDefault; // тупо приравниваю 2 массива. 
			...
		}
 
// с течением времени вызывается данная функция
		private function defWhatButtsAdd():void
		{
 
			 trace( left_to_add +" / " + left_to_addDefault); //тут 2 массива равны и дефолтное состояние отличается от объявленной
 
		}
Код:
Output: ,1,1,2,1 / ,1,1,2,1
Больше нигде дефолтное состояние не применяется в коде.
Собственно вопрос: почему, в данном случае, константная переменная изменилась? И изменяется синхронно с обычным массивом (left_to_add в данном случае)


UPD: Приравнивание через For прокатило, но все равно не понятно почему происходит явление описанное выше.


Последний раз редактировалось PHILOSOFF; 23.10.2010 в 00:57.
Старый 23.10.2010, 00:50
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
значит ты его после присваивания меняешь
да и вообще ничего не мешает напрямую менять элементы массива, объвленного как private static const left_to_addDefault:Array = ["", 4, 3, 2, 1];
сылку просто на другой массив в статическое поле left_to_addDefault НЕ засунешь

Старый 23.10.2010, 01:07
PHILOSOFF вне форума Посмотреть профиль Отправить личное сообщение для PHILOSOFF Найти все сообщения от PHILOSOFF
  № 3  
Ответить с цитированием
PHILOSOFF

Регистрация: Apr 2010
Сообщений: 34
ну обычная переменная(left_to_add) конечно меняется с течением времени, а константа создана чтобы вернуть массив в дефолт.

Тк, насколько я знаю, константа она и на то константа, чтобы с течением времени не изменяться. Т.е. присвоил один раз при объявлении и намертво.
Разве не так?)

Старый 23.10.2010, 01:18
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
как-бы обращение к массиву и к любому объекту идет по ссылке, т.е. array1 = array2 не копирует массив а просто записывает в array1 ссылку на array2,
т.е. в константу просто нельзя записать другую ссылку, а менять ее объект ничего не запрещает.

Для копирования массива можно использовать concat:
Код AS3:
left_to_add = left_to_addDefault.concat();
Тогда создастся новый массив и дефолтный не поменяется.
(но это естественно не касается элементов, входящих в массив - они не копируются, копируются только ссылки )

Старый 23.10.2010, 02:29
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 5  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Цитата:
Т.е. присвоил один раз при объявлении и намертво.
константу можно изменить
при этом, она, так сказать, начинает себя вести как переменная

ЗЫ. не помню где прочитал, поправьте если не прав
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
вы передали вашей left_to_add ссылку на массив, соответственно вы меняете массив, заданный в вашей константе

чтобы избежать таких штук наверняка, попробуйте
Код AS3:
left_to_add = left_to_addDefault.concat();
Добавлено через 2 минуты
TanaTix, константа, как ссылочный объект ссылку свою не меняет..мы не можем прописать константе ссылку на другой объект, но сам обхект по ссылке мы вполне себе можем курочить как хотим

Добавлено через 7 минут
и вообще заголовок топика порадовал: "константная переменная" )
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 23.10.2010, 16:35
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 7  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
cleptoman, в моем понимании константа... Собственно название говорит само за себя - она не должна (и, пожалуй, не должна уметь) менять свое значение.
А вот такое понятие как "ссылочный объект" заинтересовало. Можно поподробней?
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
константа свое значение и не меняет.

есть простые типы данных и есть ссылочные
простые Number,String etc
ссылочные - Object,Array

константа хранит и не меняет свое значение

Код AS3:
const SOME_ARRAY:Array = new Array();
пробуем константе засунуть ссылку на другой объект:
Код AS3:
SOME_ARRAY			= new Array();
заругается на стадии компиляции

однако на ряду с этим мы можем курочть объект, ссылку на который хранит наша константа
Код AS3:
SOME_ARRAY.push(5);
SOME_ARRAY.push(7);
trace(SOME_ARRAY); // 5,7;
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 23.10.2010, 17:53
vinch вне форума Посмотреть профиль Отправить личное сообщение для vinch Найти все сообщения от vinch
  № 9  
Ответить с цитированием
vinch

Регистрация: Feb 2010
Сообщений: 95
По аналогии с C++, константа в AS3 - это как константный указатель на объект, а не указатель на константный объект.

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
cleptoman, спасибо за разъяснение.
vinch, с С++ не знаком, но суть уже ясна.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

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

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

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


 


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


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