覆盖 Std.string

Overwrite Std.string

是否可以覆盖 Std.string 将对象转换为字符串的方式?

例如我有一个 class 人。

class Person {
    public var name:String;
}

但是当我使用时:

var p:Person = new Person("Some name");
trace(Std.string(p)); // this will return something like foo.Person( bar )

但我想要类似的东西:

var p:Person = new Person("Some name");
trace(Std.string(p)); // should return "Person(Some name)"

您可以通过实施一种方法来覆盖 Std.toString,该方法 returns 一个字符串并用“@:to”对其进行注释。示例:

class Person {
    public var name:String;
    public function new(s:String) {
        name = s;
    }
    @:to
    public inline function toString():String {
        return "Person(" + name + ")";
    }
}

class Test {
    static function main() {
        var p:Person = new Person("SomeName");
        trace(Std.string(p));
    }
}

toString() 方法添加到您的 class。

示例:https://try.haxe.org/#F7A77

它适用于 Std.string(),但可能不适用于运行时 toString()。技巧确实在运行时对javascript目标起作用,但是toString()方法将被dce删除(1).

您可以禁用 dce(我不建议将其用于 javascript 目标)或者通过添加 @:keep 元强制编译器保留您的 toString() 函数:

@:keep
function toString() {
    return "my object";
}