Руководство по actionscript. часть 3, стр. 042
Интерпретация экземпляра класса XMLL i s t как экземпляра класса XML делает использование расширения Е4Х более простым и удобным, но при этом порождает некоторые сбивающие с толку детали, особенно когда эта возможность применяется вместе с автоматическим преобразованием строк. Поближе познакомимся с этой проблемой.
Предположим, что мы создаем пользовательский интерфейс для книжного интернет-магазина, где каждая книга представлена XML-фрагментом, структура которого совпадает со структурой нашего примера с фрагментом. Когда пользователь выбирает книгу, на экране появляется соответствующее имя автора.
В нашем коде мы создаем метод displayAuthor ( ), который выводит имя автора. В первой реализации метода мы будем требовать, чтобы имя автора передавалось в виде строки:
public function displayAuthor (name:String):void { // authorField ссылается на экземпляр класса TextField, // в котором отображается имя автора authorField. text = name;
}
Когда пользователь выбирает книгу, мы получаем имя ее автора из элемента
displayAuthor(novel. AUTHOR):
Данная инструкция проста и интуитивно понятна, но, как мы уже знаем из этой главы, «за кадром» происходит очень много действий. В качестве повторения проанализируем, как это работает. Во-первых, среда выполнения Flash передает выражение novel. AUTHOR в метод displayAuthor ( ) в качестве значения параметра name. Типом данных параметра name является String, поэтому среда Flash автоматически пытается преобразовать значение выражения novel. AUTHOR в строку, используя следующее выражение:
novel. AUTHOR. toString( )
По умолчанию вызов метода toString ( ) над объектом возвращает строку в формате [obj ect ИмяКласса], но выражение novel. AUTHOR представляет экземпляр класса XMLList, а класс XMLList переопределяет метод toString ( ) собственной версией. В частности, версия метода toString ( ) класса XMLList узнает, что значение выражения novel. AUTHOR содержит только один элемент, поэтому возвращается результат вызова метода toString( ) класса XML над этим элементом. Таким образом, вызов novel. AUTHOR. toString ( ) автоматически преобразуется в вызов novel. AUTHOR [ 0 ] . toString ( ). Что же является возвращаемым значением выражения novel. AUTHOR [ 0 ] . toString ( )? Как мы уже знаем, ответ основан на факте, что выражение novel. AUTHOR [0] представляет простой элемент XML, который не содержит других элементов-потомков. Для элемента XML, не содержащего других элементов, метод toString ( ) класса XML возвращает текстовый узел данного элемента в виде строки, исключая охватывающие теги. Значит, выражение novel. AUTHOR [0] .toString( ) в качестве окончательного значения, передаваемого в метод displayAuthor ( ), вернет значение «Joyce, James» (а не «
Подведем итоги.
? Передача значения выражения novel. AUTHOR в качестве параметра типа String приводит к неявному преобразованию значения выражения novel. AUTHOR в строку.
? Значение выражения novel. AUTHOR преобразуется в строку с помощью вызова novel. AUTHOR. toString ( ).
? Выражение novel. AUTHOR. toString ( ) автоматически возвращает результат выражения novel. AUTHOR [ 0 ] . toString ( ), поскольку значение выражения novel. AUTHOR представляет экземпляр класса XMLList с одним-единственным элементом.
? Выражение novel. AUTHOR [0] . toString ( ) возвращает текст, содержащийся в элементе