Особенности типизации переменных

Являясь просто ссылкой на объект данных, переменная может хранить информацию любого типа: число, клип, объект или строку. При этом ее тип будет определяться только ее значением. В отличие от сильно типизированных языков, таких как С или Pascal, ActionScript не требует обязательного задания типа при создании переменной. Тип переменной определяется интерпретатором динамически, в ходе выполнения программы.

var а; // Тип переменной а — undefined
а=3; // Теперь а принадлежит к типу number
а+=""; // Переменная а сменила тип на string
а-=0; // И опять а — число...

Огромным преимуществом динамического определения типов является гибкость программы: так как переменная не привязана ни к одному из типов, в процессе выполнения сценария она может хранить самые различные объекты данных. Это избавляет от многих трудностей, связанных с созданием алгоритмов в сильно типизированных языках. Однако динамический контроль типов имеет и некоторые недостатки — сложность отладки, ресурсоемкость. Впрочем, в случае таких упрощенных скриптовых языков, как ActionScript, они не являются существенными.

Весьма распространенным заблуждением является то, что переменные могут хранить только элементарные объекты данных, а сложные объекты, например клипы или массивы, имеют собственные имена.


Природа этой ошибки достаточно очевидна: клипы, кнопки, текстовые поля, звуки действительно адресуются по задаваемому в специальном поле Инспектора Свойств или параметре методов attachMovie(), createEmptyMovieClip(), createTextField() идентификатору. Но расширение этой особенности на объекты типа object совершенно необоснованно (как вы помните, клипы и объекты отличаются радикально).

// Изучая скрипты из сети, в доброй трети случаев можно наблюдать следующее:

var N=100; // Переменные, хранящие элементарные значения, заданы
// с использованием var
var speed=10;
ballArray=new Array(); // Перед переменными, хранящими объекты, var не введено
ball = attachMovie ("ball", "b1", 0);

Переменные — это просто контейнеры с данными. Поэтому нет разницы, число или объект хранит переменная: при ее объявлении нужно использовать ключевое слово var. Или же, если var ввиду необязательности не используется вами, оно не должно применяться в принципе. Наличие же в коде ситуаций, подобных приведенной выше, говорит о непонимании основ языка.

Во Flash MX 2004 появилась возможность строгой типизации переменных. Но это не означает, что в ActionScript что-то изменилось г.


отношении контроля типа переменной на этапе исполнения программы. На уровне байт-кодов переменные как были бестиповыми, так бестиповыми и остались. Контроль типа переменной происходит только на этапе компиляции. Если транслятор обнаруживает, что переменной типа А присваивается объект данных типа В, то компиляция прерывается и возвращается сообщение об ошибке. У типизированных переменных есть еще ряд особенно-стей. Перечислим их:

• Если объект данных, хранимый типизированной переменной, относится не к динамическому классу (как вы помните, динамическими являются классы MovieClip, Button, TextField, Array, Object), то ему не может быть присвоено новое свойство или метод. Но это с легкостью можно сделать в случае не типизированной переменной:

// Сохраняем объект не динамического класса в типизированной переменной
var date1:Date = new Date();
//Сохраняем объект не динамического класса в не типизированной переменной
var date2 = new Dated;
date1.prop = "Время"; // Попытка присвоить новое свойство дает ошибку
date2.prop = "Время"; // Свойство успешно присваивается

Так как контроль правильности использования типизированной переменной осуществляется только на этапе компиляции, то переменной типа А можно присвоить объект данных типа В, если тип данного объекта невозможно (или сложно) определить, не выполнив сам код.


А это означает, что полностью полагаться на статический контроль типов нельзя: его надежность высокая, но далеко не стопроцентная. Пример:

// Возвращаемое функцией значение имеет тип Date - но оно успешно
// присваивается переменной с типом String
function func():Date {
return new Date();
}
var per:String = func();

Чтобы создать новое свойство (или прочитать его) для объекта не динамического класса, на который указывает типизированная переменная, нужно использовать оператор «[]», а не оператор точки. Дело в том, что определить, к какому свойству происходит обращение через оператор «[]», на этапе компиляции невозможно. Пример:

var date:Date = new Date();
date.prop = "Время"; // Строка вызывает ошибку
date["prop"] = "Время"; // Свойство присваивается успешно

В общем, типизировать переменные очень полезно. Это делает код более стройным, снижает вероятность описки, которая иначе могла бы остаться незамеченной ввиду проведения при любой операции в ActionScript преобразования типов. Однако нужно помнить, что строго типизированные переменные существуют лишь до компиляции. В транслированном коде никаких различи и между типизированной и обычной переменной не имеется: они обе будут бестиповыми..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Есть ли переменные в ActionScript?
Локальные переменные функций
Особенности операции присваивания
Создание переменных
Удаление переменных

Вернуться в раздел: Action Script / 3. Переменные