Отладка средствами функции 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".