2016-01-24 4 views
4

Я пытаюсь добавить статическую переменную и статическую функцию ко всем экземплярам класса и его дочерних классов с использованием макросов @: build и @: autoBuild.Создание функции в макросе

мне удалось получить статическую переменную работать, но я понятия не имею, как «построить» функцию из различных EFunction, эфоры и т.д.

Вот код, который я до сих пор:

macro static public function addGetId() :Array<Field> 
{ 
    var fields : Array<Field> = Context.getBuildFields(); 

    // The static _id field 
    var idField = { 
     name : "_id", 
     doc : null, 
     meta : [], 
     access : [AStatic, APrivate], 
     kind : FVar(macro : Int, macro -1), 
     pos : Context.currentPos() 
    }; 

    // The getId function field 
    var getIdField = { 
     name : "getId", 
     doc : "Returns the ID of this command type.", 
     meta : [], 
     access : [AStatic, APublic], 
     kind : FFun({ 
      params : [], 
      args : [], 
      expr: // What do I have to write here??? 
      ret : macro : Int 
     }), 
     pos : Context.currentPos() 
    }; 

    fields.push(idField); 
    fields.push(getIdField); 
    return fields; 
} 

Вот как функция, которую я хочу добавить будет выглядеть в обычном коде, если он был на самом деле в файле .hx:

public static function getId() : Int 
{ 
    if (_id == -1) 
    { 
     _id = MySingleton.getInst().myGreatFunction() 
    } 
    return _id; 
}; 

Так ссылается на недавно добавленный «_id» переменную а s, а также некоторые функции одноэлементного класса.
Итак: Как будет выглядеть полный getIdField?

Бонус Вопрос:
Моя самая большая проблема с этим полное отсутствие документации об этих функциях, а также любые полезные примеры в руководстве. Есть ли действительно полезный учебник для создания таких функций?

Бонус Бонус Вопрос:
Что такое различие между Params и арг в классе FFun?

ответ

3

Вы можете использовать reification написать тело функции, как вы бы в обычном коде Haxe:

expr: macro { 
     if (_id == -1) { 
      _id = 0; 
     } 
     return _id; 
    }, 

params представляет собой список параметров типа, args список аргументов в функция получает. Там в пустяков раздел об этом on the Haxe Manual:

Общая информация: Аргумент против параметра

В некоторых других языках программирования, аргумента и параметр используются как взаимозаменяемые. В Haxe, аргумент используется при обращении к методам и параметр относится к Type Parameters.

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