Отладка средствами функции trace

Фукнция trace в haXe является мощным средством отладки. Ее можно вызывать в любом месте кода (она имеет глобальную область видимости):

trace("Hello world !");

По умолчанию, во флэш, функция trace отображает сообщения в прокручиваемом TextField, в Neko сообщения выводятся на стандартный вывод, в JavaScript отображаются в "DIV" с ID "haxe:trace". Каждый вызов trace сопровождается именем файла и номером строки кода, откуда он был вызван:

Test.hx:11: Hello world !

Во флэш можно очистить вывод вызвом Log.clear().

Переопределение функции trace

Можно переопределить поведение функции trace изменив метод "Log.trace", куда перенаправляются все ее вызовы. Например:

class MyTrace {

    public static function setRedirection() {
        haxe.Log.trace = myTrace;
    }

    private static function myTrace( v : Dynamic, ?inf : haxe.PosInfos ) {
        // .....
    }

}

Первый параметр -- v -- сообщение (как "Hello World" в предыдущем примере), оно может быть любого типа, но приводится к типу String . Параметр inf -- структура данных, содержащая информацию о месте вызова trace:

package haxe;

typedef PosInfos = {
    var fileName : String;
    var lineNumber : Int;
    var className : String;
    var methodName : String;
    var customParams : Array<Dynamic>;
}

Массив customParams содержит все дополнительные параметры, переданные в вызове trace.

Например:

class Test {
    function foo() {
        trace("hello","warning",123);
    }
}

Этот код будет скомпилирован так, как будно вызов был сделан следующим образом:

    haxe.Log.trace(
        "hello",
        { 
            className : "Test",
            methodName : "foo",
            fileName : "Test.hx",
            lineNumber : 3,
            customParams : ["warning",123]
        }
    );

Удаление вызовов trace

Все вызовы trace удаляются из кода, если при компиляции использовался параметр "--no-traces". В результате байт-код получается таким, как будто вызовов trace вообще не было в коде.

Идентификатор here

Еще один способ получить информацию о текущей позиции в коде, это использование идентификатора "here", который автоматически заменяется структурой типа "haxe.PosInfos":

class Test {
    static function main() {
        trace(here.methodName);
    }
}

Тут, конечно, будет выведено: "main".

Дополнительные параметры позиции

Иногда необходимо отпределить собственные методы отладки. Для примера рассмотрим такой класс:

class Test {
 
    static function assert( cond : Bool, ?pos : haxe.PosInfos ) {
      if( !cond )
          haxe.Log.trace("Assert in "+pos.className+"::"+pos.methodName,pos);
    }

    static function main() {
        assert( 1 == 1 ); // nothing
        assert( 0 == 3 ); // trace "Assert in Test::main"
    }

}

Такой код возможен, потому что везде, где метод ожидает необязательный параметр типа "haxe.PosInfos", и этот параметр не задан, то по умолчанию подставляется значение "here" вместо "null".

version #4062, modified 2008-08-29 00:00:46 by yzh44yzh