2013-06-12 2 views
0

По какой-то причине AS3 не распознает дочернюю функцию класса XML как функцию.xml.child не является функцией?

В Документах:

child(propertyName:Object):XMLList 

Списки потомков объекта XML объекта.

var xml:XML = new XML (
    <body> 
     <bar value = "1"/> 
     <foo value = "2"/> 
    </body>); 

var f:Function = xml.child as Function; 
trace(XMLList(f("foo")).toXMLString()); 

Этот код выдает ошибку: Error #1006: value is not a function.

При дальнейшем осмотре, f оказывается null.
Так что мой вопрос: как назначить функцию child() класса XML переменной типа Function?

На стороне примечание, причина в том, что это необходимо из-за его использования в служебной функции, forEach(arr:Array, f:Function):Array, которая выполняет функцию f по каждому элементу массива и возвращает результат.

ответ

0

Я не уверен, как Flash Player реализует класс XML, но

trace(typeof(xml.child)); /*xml being in instance of XML class*/ 

выходы "XML".

Для вашей проблемы, однако, вы можете создать другую собственную функцию, которая берет объект XML и возвращает xml.child(). Затем вы можете передать эту функцию как параметр для forEach.

обновление аппроксимируемостью комментариев:

Чистота мудрый, я думаю, что вся эта функциональность может быть экспортирована в другое подразделение (класс), который имеет переменную-член, содержащий XML. Теперь функция-член этого класса может получить доступ к переменной-члену xml, а также взять 1 параметр, как требуется для forEach.

В противном случае, в качестве ярлыка вы можете иметь что-то вроде:

private function actualFunction(xml:XML, name:String):XML 
{ 
    return xml.child(name); 
} 

private function closureAroundActual(xml:XML):Function 
{ 
    return function(name:String):XML 
    { 
     actualFunction(xml, name); 
    } 
} 

Затем используйте его в качестве Foreach

forEach(arr, closureAroundActual(xml)){}

Я только что ввели код здесь, так что синтаксис может быть откусил. Но, я думаю, вы получили бы эту идею.

+0

Да, но такая функция должна принимать два параметра: один для объекта xml и другой для параметра propertyName: String. Поскольку forEach() принимает функции только с одним параметром, мне нужно передать либо функцию xml.child, либо функцию с тем же заголовком, что и xml.child – bananasplits

+0

обновил ответ ... HTH – catholicon

+0

Это общий подход, который вы должны принять , В моем случае, из-за устройства, я смог пройти, вложив функцию в другую, чтобы экземпляр xml был в области видимости, и я мог бы вызвать xml.child(), используя только один параметр. Таким образом, функция удовлетворяла требованиям forEach() – bananasplits

Смежные вопросы