Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Константная переменная изменяется при работе приложения (http://www.flasher.ru/forum/showthread.php?t=145915)

PHILOSOFF 23.10.2010 00:46

Константная переменная изменяется при работе приложения
 
Не пойму логику поведения программы.

Код 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 прокатило, но все равно не понятно почему происходит явление описанное выше.

expl 23.10.2010 00:50

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

PHILOSOFF 23.10.2010 01:07

ну обычная переменная(left_to_add) конечно меняется с течением времени, а константа создана чтобы вернуть массив в дефолт.

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

expl 23.10.2010 01:18

как-бы обращение к массиву и к любому объекту идет по ссылке, т.е. array1 = array2 не копирует массив а просто записывает в array1 ссылку на array2,
т.е. в константу просто нельзя записать другую ссылку, а менять ее объект ничего не запрещает.

Для копирования массива можно использовать concat:
Код AS3:

left_to_add = left_to_addDefault.concat();

Тогда создастся новый массив и дефолтный не поменяется.
(но это естественно не касается элементов, входящих в массив - они не копируются, копируются только ссылки :) )

TanaTiX 23.10.2010 02:29

Цитата:

Т.е. присвоил один раз при объявлении и намертво.
константу можно изменить
при этом, она, так сказать, начинает себя вести как переменная

ЗЫ. не помню где прочитал, поправьте если не прав

cleptoman 23.10.2010 16:27

вы передали вашей left_to_add ссылку на массив, соответственно вы меняете массив, заданный в вашей константе

чтобы избежать таких штук наверняка, попробуйте
Код AS3:

left_to_add = left_to_addDefault.concat();

Добавлено через 2 минуты
TanaTix, константа, как ссылочный объект ссылку свою не меняет..мы не можем прописать константе ссылку на другой объект, но сам обхект по ссылке мы вполне себе можем курочить как хотим

Добавлено через 7 минут
и вообще заголовок топика порадовал: "константная переменная" )

TanaTiX 23.10.2010 16:35

cleptoman, в моем понимании константа... Собственно название говорит само за себя - она не должна (и, пожалуй, не должна уметь) менять свое значение.
А вот такое понятие как "ссылочный объект" заинтересовало. Можно поподробней?

cleptoman 23.10.2010 16:43

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

есть простые типы данных и есть ссылочные
простые 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;


vinch 23.10.2010 17:53

По аналогии с C++, константа в AS3 - это как константный указатель на объект, а не указатель на константный объект.

TanaTiX 23.10.2010 18:00

cleptoman, спасибо за разъяснение.
vinch, с С++ не знаком, но суть уже ясна.


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

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