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

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

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

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Почему не изменяется значение boolean

Здравствуйте! Подскажите, пожалуйста.

Код AS3:
import flash.events.Event;
 
var myBoolean:Boolean = true;
var myNumber:int = 0;
 
stage.addEventListener(Event.ENTER_FRAME, updateFrames);
function updateFrames(event:Event):void
{
	//Если myBoolean true,
	if(myBoolean)
	{
		trace("Выполняется условие связанное с myBoolean!");
 
		//Если myNumber больше 9, то:
		if(myNumber > 9)
		{
			trace("Выполняется условие связанное с myNumber!");
			//Изменяю значение myBoolean на false:
			myBoolean = false;
		}
		//Или если не больше, то:
		else
		{
			myNumber += 1;
		}
	}
}
Код:
Вывод:

Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myBoolean!
Выполняется условие связанное с myNumber! ++++
Всё отлично, но когда я делаю так:

Код AS3:
import flash.events.Event;
 
var myBoolean:Boolean = true;
var myNumber:int = 0;
 
stage.addEventListener(Event.ENTER_FRAME, updateFrames);
function updateFrames(event:Event):void
{
	myFunction(myBoolean,myNumber);
}
 
function myFunction(boolean,number)
{
	//Если myBoolean true,
	if(boolean)
	{
		trace("Выполняется условие связанное с boolean!");
		//Если myNumber больше 9, то:
		if(number > 9)
		{
			trace("Выполняется условие связанное с number!");
			//Изменяю значение myBoolean на false:
			boolean = false;
		}
		//Или если не больше, то:
		else
		{
			number += 1;
		}
	}
}
То происходит какое-то неведомое безобразие:
Код AS3:
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
Выполняется условие связанное с boolean!
И до бесконечности.

Как такое чудо можно исправить? Большое спасибо.

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Boolean не передается по ссылке.
__________________
hauts.ru

Старый 12.01.2013, 13:34
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 3  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Hauts Посмотреть сообщение
Boolean не передается по ссылке.
Какая беда. А можете сказать почему (если знаете)?

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

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Потому что это простой тип. Такое устройство языка – простые типы передаются по ссылке, сложные – по значению.
Вы можете завернуть Ваш тип в сложный объект:
Код AS3:
var object = {boolean: true; }
 
...
if (object.boolean){
...
}
 
object.boolean = false;
Или работать вообще с полем myBoolean напрямую – это более правильно. Если нужно "много" таких элементов – то очевидно, одним myBoolean не обойтись и это вполне себе тянет на создание нового класса. Оп! Оп! Оп! О-о-о -ооо пэ!

Старый 12.01.2013, 14:30
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Мы за типобезопасность:
Код AS3:
var link:BoolLink = new BoolLink(true);
...
if (link.value) {
...
}
 
link.value = false;
Это работает немного быстрее, чем использование динамического объекта {boolean: true};
Но на практике это страсть как редко используется, обычно поля делают типа boolean, но объектов не создают - дорого очень.

Кстати, тут даже дело не в примитивности типа:
Код AS3:
var a = {};
var b = {};
 
f1(a, b)
trace(a == b)//false;
 
a.x = 1;
b.x = 2;
f2(a, b);
trace(a.x == b.x)// true;
 
function f1(a, b) { a = b; }
function f2(a, b) { a.x = b.x; }

Старый 12.01.2013, 14:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Такое устройство языка – простые типы передаются по ссылке, сложные – по значению.
Наоборот

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

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Вот черт.

Старый 13.01.2013, 04:12
Newred вне форума Посмотреть профиль Отправить личное сообщение для Newred Посетить домашнюю страницу Newred Найти все сообщения от Newred
  № 8  
Ответить с цитированием
Newred
 
Аватар для Newred

Регистрация: May 2010
Адрес: Киев, Украина
Сообщений: 140
Записей в блоге: 2
А может всё намного проще ?

Вместо такой записи:
Код AS3:
function myFunction(boolean,number)
Делаем такую:
Код AS3:
function myFunction(boolean:Boolean, number:Number)
__________________
Примеры работ/исходный код: http://ccc.pp.ua

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну и какая разница? В функцию так и будут посылаться true и 0, потому как функция никак не изменяет ни myBoolean, ни myNumber. Понятно что 0+1 никогда не станет больше 9, а true никогда не станет false. Ну а то, что аргументы не типизированы, при нестрогой компиляции неважно. То есть исправить конечно же надо, но к проблеме это никакого отношения не имеет.
__________________
Reality.getBounds(this);

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

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

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


 


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


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