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

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

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

Регистрация: May 2011
Сообщений: 7
По умолчанию Передача ссылки на объект в функцию.

Натолкнулся на одну неприятную особенность AS3. Суть ее состоит в следующем: Присвоить объекту, передаваемому в функцию по ссылке, новое значение можно лишь в двух случаях:

1) Когда переопределяются заранее известные свойства этого объекта:

Код AS3:
function change( target:Point )
{	
	target.x = 300;
	target.y = 300;
}
 
var p:Point = new Point( 100, 100 );
trace( p ); // Выведет (x=100, y=100)
change( p );
trace( p ); // Выведет (x=300, y=300), т.к. свойства объекта были переопределены.
2) Когда новое значение присваивается известному свойству( которое и будет искомым объектом ):

Код AS3:
function change( target:DisplayObject )
{
	target["p"] = new Point( 300, 300 );
}
 
var p:Point = new Point( 100, 100 );
trace( p );
change( this );
trace( p ); // Данный пример в поле Outputs выведет те же значения, что и в первом случае.
Однако эти два варианта не подходят, ибо желаемый результат может быть получен только при присваивании объекту нового экземпляра класса:
Код AS3:
function change( target:Point )
{
	target = new Point( 300, 300 );
}
 
var p:Point = new Point( 100, 100 );
trace( p ); // Выведет (x=100, y=100)
change( p );
trace( p );  // Выведет (x=100, y=100)
Видимо так происходит потому, что в функции вместо ссылки в переменную "target" записывается новый экземпляр класса Point, что не изменяет объект, располагаемый "на другом конце" ссылки. Но не удивительно, что это вообще никаким образом не подходит. Прошу помочь решить.

Старый 03.08.2011, 21:31
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Код AS3:
trace(Point is DisplayObject); // false
Код AS3:
function change( target:Point ):Point {
	return new Point( target.x + 300, target.y + 300 );
}
var poin:Point = new Point(100, 100);
point = change(point);
trace(point); // 400, 400
Добавлено через 3 минуты
Цитата:
Видимо так происходит потому, что в функции вместо ссылки в переменную "target" записывается новый экземпляр класса Point, что не изменяет объект, располагаемый "на другом конце" ссылки.
Разве Point простой тип?

Добавлено через 6 минут
Код AS3:
_point = new Point(1, 1);
trace(_point); // 1, 1
changePoint(_point);
trace(_point); // 200, 1
 
private function changePoint(point:Point):void {
	trace(_point === point); // true
	point.x = 200;
	trace(point); // 200, 1
}
__________________
тут я


Последний раз редактировалось КорДум; 03.08.2011 в 21:39.
Старый 03.08.2011, 21:48
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 3  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Может быть, вам такой вариант подойдет:

Код AS3:
function change(target : Point ):Point
{
	return new Point(target.x + 100 , target.x + 100);
}
 
var p:Point = new Point( 100, 100 );
trace(p); // Выведет (x=100, y=100)
p = change(p);
trace(p);  // Выведет (x=200, y=200)
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.


Последний раз редактировалось ChuwY; 03.08.2011 в 22:02.
Старый 03.08.2011, 21:52
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
ChuwY, ты не успел
__________________
тут я

Старый 03.08.2011, 21:55
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 5  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Судя по тому, что говорите про ссылки - знакомы с С++.
Вот представьте, что у вас в функцию всегда передается указатель на обьект (когда обьект не элементарного типа). Никаких двойных указателей и передачи указателя по ссылке нет. Это as3.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 03.08.2011, 22:08
preyko вне форума Посмотреть профиль Отправить личное сообщение для preyko Найти все сообщения от preyko
  № 6  
Ответить с цитированием
preyko

Регистрация: May 2011
Сообщений: 7
Цитата:
Сообщение от КорДум Посмотреть сообщение
Код AS3:
trace(Point is DisplayObject); // false
Это я приводил пример того что если я знаю имя свойства, то могу с ним сделать именно то, что хочу. И тот экземпляр класса Point просто является свойством на сцене. Да и вполне можно заметить, что в функцию передается далеко не Point ...


Цитата:
Сообщение от КорДум Посмотреть сообщение
Код AS3:
function change( target:Point ):Point {
	return new Point( target.x + 300, target.y + 300 );
}
var poin:Point = new Point(100, 100);
point = change(point);
trace(point); // 400, 400
Такой вариант вообще никуда не годится. Слишком не подходит это к моей задаче.


Цитата:
Сообщение от КорДум Посмотреть сообщение
Код AS3:
_point = new Point(1, 1);
trace(_point); // 1, 1
changePoint(_point);
trace(_point); // 200, 1
 
private function changePoint(point:Point):void {
	trace(_point === point); // true
	point.x = 200;
	trace(point); // 200, 1
}
Данный способ тоже не подходит, ибо это точка - не настоящее свойство некого класса, а get/set метод. И при попытки определения свойства объекта, возвращаемого get-методом, порой происходят весьма странные вещи.

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

Регистрация: Sep 2002
Сообщений: 30,784
preyko, всё передаётся ссылками. Ссылку на сеттер, как функцию, получить невозможно.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Передается ссылками, только в геттере как раз может быть return new Point(_x, _y); равно как и в сеттере _point = new Point(value.x, value.y);
__________________
Reality.getBounds(this);

Старый 04.08.2011, 01:43
preyko вне форума Посмотреть профиль Отправить личное сообщение для preyko Найти все сообщения от preyko
  № 9  
Ответить с цитированием
preyko

Регистрация: May 2011
Сообщений: 7
И вправду. Нельзя передать ссылку на сет метод. Дело то все в том, что аргументом функции change() должен быть экземпляр класса Point, и передавая туда некое свойство, которое по сути set/get метод, мы создаем новый экземпляр, который попадает в функцию вместо ссылки на этот самый метод.
Это демонстрирует следующий пример:
Код AS3:
function change( target:Star )
{
	trace( "f", target.p );
	target.p = new Point( 200, 100 );
	trace( "f", target.p );
}
function change1( target:Point )
{
	trace( "f", target );
	target = new Point( 300, 100 );
	trace( "f", target );
}
 
var s:Star = new Star( 100, 100 );
trace( s.p );
change( s );
trace( s.p );
 
trace();
 
trace( s.p );
change1( s.p );
trace( s.p );
Здесь класс Star просто содержит в себе закрытое свойство Pos, а set/get метод p оперирует ими.

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

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

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


 


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


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