Способ печати для Eval (литералы), а не для человека для чтения? - PullRequest
4 голосов
/ 11 июля 2019

Я вижу, что trace() и Sys.print() оба дают мне читабельный вывод.Например, если я распечатаю массив

var a = ["", "1", "", "2", "3"];

, я получу печать:

[,1,,2,3]

Есть ли какая-нибудь функция "eval print", которая выдаст мне вывод, например:

["", "1", "", "2", "3"]

То есть, литерал, который я мог бы затем использовать для копирования / вставки в код, если бы захотел (и, между прочим, что может быть eval'd, чтобы дать мне этот точный массив строк).

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Одним из возможных решений может быть использование haxe.macro.Printer.printExpr().ExprTools.toString() - это удобная функция, которая делает это для вас.Обратите внимание, что для этого требуется передать литерал массива непосредственно в функцию макрокоманды вместо передачи идентификатора, подобного a (значение которого неизвестно во время компиляции).

import haxe.macro.Context;
import haxe.macro.Expr;

using haxe.macro.ExprTools;

class Main {
    static function main() {
        var string:String = printExpression(["", "1", "", "2", "3"]);
        trace(string); // source/Main.hx:9: ["", "1", "", "2", "3"]
    }

    static macro function printExpression(e:Expr):Expr {
        return macro $v{e.toString()};
    }
}

Кроме этого, вы бывероятно, придется реализовать собственную версию Std.string(), которая печатает строки с кавычками.

2 голосов
/ 11 июля 2019

Вы можете использовать Json для этого

trace(haxe.Json.stringify(a));
...