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

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

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

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
По умолчанию Присваивание значений, не ссылок

И снова здраствуйте.
На этот раз я уверен в том, что передаются именно ссылки.
Вот код:
Код:
var startString:Array=[0,1,2,3,4,5];
var step1:Array = startString;
step1[1] = -50;
var step2:Array = startString;
step2[2] = 800;
trace(step1);
trace(step2);
trace(startString);
Как то ожидаю что все 3 значения будут разными, и более того, мне ну уж очень не хочется менять startString. Конечно, можно использовать извращения с concat`ом и т.д., но как правильно решить проблему?

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

Регистрация: Sep 2002
Адрес: simferopol
Сообщений: 981
Отправить сообщение для Chas с помощью ICQ
этот вопрос задается ежедневно. и немного задолбал.
Этот вопрос - проблема современности. Это из-за того, что нынешние недопрограммисты не учат низкоуровневые языки. Они даже и предположить не могут, что объект не умеет вот так вот взять и раздвоиться, он ведь о себе ничего не знает. И что в некоторых языках, чтобы получить копию объекта, перегружают оператор =. А потом появляются вопросы типа "а чего это я написал object2=object1 и при изменении object2 меняется object1" или "а почему в SharedObject при flush не сохраняются объекты "....

ах, да. по теме
Код:
var startString:Array=[0,1,2,3,4,5];
var step1:Array = startString.slice();
step1[1] = -50;
var step2:Array = startString.slice();
step2[2] = 800;
trace(step1);
trace(step2);
trace(startString);
__________________
~
Never trouble trouble till trouble troubles you!

Старый 13.12.2008, 16:55
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Спасибо
Цитата:
этот вопрос задается ежедневно. и немного задолбал.
если этот вопрос задается каждый день - почему бы просто не дать ссылку на этот трейд?
Цитата:
Это из-за того, что нынешние недопрограммисты не учат низкоуровневые языки.
Вася Пупкин - сисадмин. Ему нужно починить компьютер. Он прекрасно справляется со своими обязанностями, но вдруг оказалось, что он не может чинить компьютеры 1х и 2х поколений, а так же не может на глаз прочитать код на перфокартах, поэтому прошу уволить этого недосисадмина.
Звучит примерно так.
Цитата:
Они даже и предположить не могут, что объект не умеет вот так вот взять и раздвоиться, он ведь о себе ничего не знает.
Какая жалость, только ведь мы предположили, что я присваивал ссылку, то бишь не управлял 3 разными массивами? Значит, наверное, ты не прав.

Цитата:
И что в некоторых языках, чтобы получить копию объекта, перегружают оператор =.
Мы пишем на АС, ведь так? И я даже предположить не могу, что люди на паскале не могут написать вот так: someArr=[], а люди, пишущие на бэйсике не должны ставить точки с запятой после операторов. Ну, а сппшники использовать var как имя для переменной. Верно, зачем мне это предпологать?

Но ещё раз спасибо.

Старый 13.12.2008, 17:47
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 4  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Дело в том, что существуют Value и Reference Types. Когда мы приравниваем один Value Type к другому, то мы создаем копию значения. Например:
Код AS3:
var a:Number = 42;
var b:Number = a;
Теперь у нас в памяти две переменные с одинаковым значением.
Когда мы приравниваем Reference Type, мы не создаем копию объекта, а всего лишь даем ссылку на существующий объект. Например:
Код AS3:
var obj1:Apple = new Apple();
var obj2:Apple = obj1;
var obj3:Apple = obj1;
Хоть мы и создали три переменных, все равно в памяти только один объект Apple, и все на него ссылаются. Поэтому при изменении, например, obj3, obj1 тоже изменится (точнее не obj1, а тот единственный объект Apple).
Array как раз является ссылочным типом.

Старый 13.12.2008, 19:25
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
2Волгоградец: а методы борьбы с этим?

Старый 13.12.2008, 19:46
elmortem вне форума Посмотреть профиль Отправить личное сообщение для elmortem Посетить домашнюю страницу elmortem Найти все сообщения от elmortem
  № 6  
Ответить с цитированием
elmortem
 
Аватар для elmortem

Регистрация: Sep 2008
Адрес: Terra
Сообщений: 64
Отправить сообщение для elmortem с помощью Skype™
Psycho Tiger
В твоём случае нужно сделать копию объекта и присвоить её переменной. Chas уже привёл тебе работающий код.
__________________
Тихо, идёт запись!

Старый 13.12.2008, 21:29
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Psycho Tiger, не надо с этим бороться. Нужна именно копия — напиши метод clone().

Старый 14.12.2008, 13:49
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Через ByteArray?

Старый 14.12.2008, 13:52
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Зачем? У массивов есть concat/slice и куча других методов, возвращающих новый массив. Для других объектов надо писать метод клонирования.

Старый 14.12.2008, 14:13
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Ну, для других то ByteArray подойдет?

Кстати, а что здесь не так?
Код AS3:
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
Функция getReIm возвращает 2-мерный массив, с четными и нечетными индексами.
Куда сейчас делась моя сотня?

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

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

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


 


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


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