PDA

Просмотр полной версии : на фига козе баян или зачем флешу type hint?


firelord
31.01.2007, 16:58
Все больше к сожалению убеждаюсь, что флеш с трудом годится для разработки полноценных приложений.

В частности, сломал себе мозг, пытаясь понять, почему не работает одна функция, например:

function foo(left:Number,width:Number) {
return left+width;
}
//обратите внимание на тип параметров

var _xml=new XML();
_xml.parseXML("<foo left=\"1\" width=\"5\"/>");
//в реальности, конечно, xml грузится снаружи...

var node=_xml.childNodes[0];
trace(node.attributes.left+","+node.attributes.width);
//вы удивитесь, но left действительно = 1, а width = 5

trace(foo(node.attributes.left,node.attributes.width));
//что вы ожидаете увидеть тут? 6? наивные! 15! :)))


несмотря на то, что параметры функции объявлены как Number, флеш без зазрения совести засовывает в них String из XML - ни на что, конечно, не ругаясь, и успешно осуществляет конкатенацию строк вместо арифметической операции :yahoo:

первый вопрос - риторический: на фига тогда вообще type hinting флешу, если он не может самостоятельно элементарной операции приведения типов выполнить?

и теперь вопрос ПО СУЩЕСТВУ: понимаю, что мои замашки программера тут явно не к месту - как вообще принято такие вещи писать на ActionScript - "правильно" с точки зрения флеша? или надо каждый раз внутри функции принудительно приводить тип?

З.Ы. кстати, а как тип вообще приводить? ;)

firelord
31.01.2007, 17:01
приведение типа нашел. все функции теперь расширять? ;)

__i
31.01.2007, 17:11
Все. Строку всегда нужно приводить к числу. Во флеше есть такая фигня как(незнаю как научно называется) изменение типа переменой в зависимости от его содержимого.
Ты свободно можешь написать;
var a : Number = 123;
a='ioweoipewqowqoip'

CorC
31.01.2007, 17:24
function foo(left:Number,width:Number):Number {
return left+width;
}
foo(Number(a),Number(b));

проблем ранее тахих не было :)
либо NaN либо число :) 3 не дано

firelord
31.01.2007, 17:39
не, ну что делать - понятно, я думал, может есть какой-нибудь ИЗЯЩНЫЙ способ ;) спасибо!

CorC
31.01.2007, 18:15
изящный способ всегда везде строго тип соблюдать и все
изящнее не бывает :)

iNils
31.01.2007, 18:41
function foo (a:Number, b:Number) {
return a + b;
}

//// false
//trace (foo ("1", "1"));

//// true
//a = "1";
//b = "1";
//trace (foo (a, b));

//// false
//var a:Number = "1";
//var b:Number = "1";
//trace (foo (a, b));

Три примера. По очереди расскомментарьте каждый и посмотрите реакцию флеша. true - когда флеш не ругается. false когда ругается.
Почему в первом примере у нас ошибка, а во втором нет?
Потому, что в первом мы отдаем непосредственно сами значения. А во втором переменные, тип которых мы не определили. А как известно, тип во флеше играет роль только при компиляции, а не во время исполения и флеш также как и раньше производит автоматическое преобразование типов. Это лекго проверить с помощью
function foo (a:Number, b:Number) {
return a * 1 + b * 1;
}

a = "1";
b = "1";
trace (foo (a, b));На выходе мы получаем 2, а не "11"

firelord
31.01.2007, 18:45
спасибо! достаточно развернутый комментарий - и главное - ответ на главный вопрос - "зачем флешу type hinting?" - для устранения ошибок на стадии компиляции ;)