![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Apr 2010
Сообщений: 34
|
Не пойму логику поведения программы.
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 массива равны и дефолтное состояние отличается от объявленной } Собственно вопрос: почему, в данном случае, константная переменная изменилась? И изменяется синхронно с обычным массивом (left_to_add в данном случае) UPD: Приравнивание через For прокатило, но все равно не понятно почему происходит явление описанное выше. Последний раз редактировалось PHILOSOFF; 23.10.2010 в 00:57. |
|
|||||
|
значит ты его после присваивания меняешь
да и вообще ничего не мешает напрямую менять элементы массива, объвленного как private static const left_to_addDefault:Array = ["", 4, 3, 2, 1]; сылку просто на другой массив в статическое поле left_to_addDefault НЕ засунешь |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 34
|
ну обычная переменная(left_to_add) конечно меняется с течением времени, а константа создана чтобы вернуть массив в дефолт.
Тк, насколько я знаю, константа она и на то константа, чтобы с течением времени не изменяться. Т.е. присвоил один раз при объявлении и намертво. Разве не так?) |
|
|||||
|
как-бы обращение к массиву и к любому объекту идет по ссылке, т.е. array1 = array2 не копирует массив а просто записывает в array1 ссылку на array2,
т.е. в константу просто нельзя записать другую ссылку, а менять ее объект ничего не запрещает. Для копирования массива можно использовать concat: Тогда создастся новый массив и дефолтный не поменяется. (но это естественно не касается элементов, входящих в массив - они не копируются, копируются только ссылки ) |
|
|||||
|
Цитата:
при этом, она, так сказать, начинает себя вести как переменная ЗЫ. не помню где прочитал, поправьте если не прав
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
вы передали вашей left_to_add ссылку на массив, соответственно вы меняете массив, заданный в вашей константе
чтобы избежать таких штук наверняка, попробуйте Добавлено через 2 минуты TanaTix, константа, как ссылочный объект ссылку свою не меняет..мы не можем прописать константе ссылку на другой объект, но сам обхект по ссылке мы вполне себе можем курочить как хотим Добавлено через 7 минут и вообще заголовок топика порадовал: "константная переменная" )
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
cleptoman, в моем понимании константа... Собственно название говорит само за себя - она не должна (и, пожалуй, не должна уметь) менять свое значение.
А вот такое понятие как "ссылочный объект" заинтересовало. Можно поподробней?
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
константа свое значение и не меняет.
есть простые типы данных и есть ссылочные простые Number,String etc ссылочные - Object,Array константа хранит и не меняет свое значение пробуем константе засунуть ссылку на другой объект: заругается на стадии компиляции однако на ряду с этим мы можем курочть объект, ссылку на который хранит наша константа
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Регистрация: Feb 2010
Сообщений: 95
|
По аналогии с C++, константа в AS3 - это как константный указатель на объект, а не указатель на константный объект.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 06:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|