覆盖Std.string

时间:2017-12-30 15:50:39

标签: haxe

是否可以覆盖Std.string如何将对象转换为字符串?

E.g。我有一个班级人员。

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)"

2 个答案:

答案 0 :(得分:3)

向您的班级添加toString()方法。

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

它可以与Std.string()一起使用,但可能不适用于运行时toString() 技巧在运行时为javascript目标工作, toString()方法将被dce(1)删除。

您可以禁用dce(我不建议将其用于javascript目标)或只是强制编译器通过添加toString()元来保持@:keep功能:

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

答案 1 :(得分:-1)

您可以通过实现一个返回字符串并使用" @:to"注释它的方法来覆盖Std.toString。例如:

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));
    }
}