![]() |
|
||||||||||
|
|||||
|
И снова здраствуйте.
На этот раз я уверен в том, что передаются именно ссылки. Вот код: Как то ожидаю что все 3 значения будут разными, и более того, мне ну уж очень не хочется менять startString. Конечно, можно использовать извращения с concat`ом и т.д., но как правильно решить проблему?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
[+1 14.08.08]
[+1 20.08.08] |
этот вопрос задается ежедневно. и немного задолбал.
Этот вопрос - проблема современности. Это из-за того, что нынешние недопрограммисты не учат низкоуровневые языки. Они даже и предположить не могут, что объект не умеет вот так вот взять и раздвоиться, он ведь о себе ничего не знает. И что в некоторых языках, чтобы получить копию объекта, перегружают оператор =. А потом появляются вопросы типа "а чего это я написал object2=object1 и при изменении object2 меняется object1" или "а почему в SharedObject при flush не сохраняются объекты ".... ах, да. по теме
__________________
~ Never trouble trouble till trouble troubles you! |
|
|||||
|
Спасибо
Цитата:
Цитата:
Звучит примерно так. Цитата:
Цитата:
Но ещё раз спасибо.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Дело в том, что существуют Value и Reference Types. Когда мы приравниваем один Value Type к другому, то мы создаем копию значения. Например:
Теперь у нас в памяти две переменные с одинаковым значением. Когда мы приравниваем Reference Type, мы не создаем копию объекта, а всего лишь даем ссылку на существующий объект. Например: Хоть мы и создали три переменных, все равно в памяти только один объект Apple, и все на него ссылаются. Поэтому при изменении, например, obj3, obj1 тоже изменится (точнее не obj1, а тот единственный объект Apple). Array как раз является ссылочным типом. |
|
|||||
|
2Волгоградец: а методы борьбы с этим?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Psycho Tiger
В твоём случае нужно сделать копию объекта и присвоить её переменной. Chas уже привёл тебе работающий код.
__________________
Тихо, идёт запись! |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Psycho Tiger, не надо с этим бороться. Нужна именно копия — напиши метод clone().
|
|
|||||
|
Через ByteArray?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Зачем? У массивов есть concat/slice и куча других методов, возвращающих новый массив. Для других объектов надо писать метод клонирования.
|
|
|||||
|
Ну, для других то ByteArray подойдет?
Кстати, а что здесь не так? function getReIm(arr:Array):Array { var i:int; var l:int = arr.length; var resArr:Array = new Array(); resArr[0] = []; resArr[1] = []; for (i = 0; i < l; i += 2) { resArr[0].push(Number(arr[i])); resArr[1].push(Number(arr[i + 1])); } return resArr; } var startString:Array=[1,0,2,0,3,0,4,0,5,0]; var step1:Array = startString.slice(); step1[0] = 200; var step2:Array = step1.slice(); step2[1] = 100; trace(getReIm(step1)[0]); //200,2,3,4,5 trace(getReIm(step2)[0]); //200,2,3,4,5 Куда сейчас делась моя сотня?
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:03. |
|
|
« Предыдущая тема | Следующая тема » |
|
|