2017-12-30 8 views
2

Std.string에서 개체를 문자열로 변환하는 방법을 덮어 쓸 수 있습니까?Std.string 덮어 쓰기

예. 저는 Person 클래스가 있습니다.

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

그러나 나는 같은 것을 갖고 싶어 : 그러나

class Person { 
    public var name:String; 
} 

내가 사용할 때 문자열을 반환하는 방법을 구현하여 Std.toString를 덮어 쓸 수 있습니다

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

답변

3

toString() 메서드를 클래스에 추가하십시오.

예 : https://try.haxe.org/#F7A77

그것은 Std.string()와 함께 작동하지만 런타임 toString() 작동하지 않을 수 있습니다. 트릭 이 javascript 타겟의 런타임에서 작동하지만 이지만toString() 메서드가 dce (1)에 의해 제거됩니다.

할 수 있습니다 중 하나를 비활성화 DCE (I 자바 스크립트 목표를 위해 그것을 권하고 싶지 않다) 아니면 그냥 @:keep 메타 추가하여 toString() 기능을 유지하기 위해 컴파일러를 강제로 :

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

및 주석 그것을 "@ : 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)); 
    } 
} 
+0

을'@ to' 여기에 아무것도 절대적으로하지 않습니다 , 추상화에 대한 암시 적 변환 방법입니다. 또한,'trace (Std.string (p))'는'trace (p)'와 중복/동일합니다. – Gama11

+2

'trace (Std.string (p))'는'trace (p)'와 완전히 똑같지는 않습니다. 전자는'toString()'을 런타임에 해석하고, 후자는 컴파일 타임에 해석합니다. – KevinResoL

+1

여전히 중복 되었기 때문에 동일한 최종 결과를 얻었습니다.'trace'에서 명시 적으로'Std.string()'을 사용하는 것은 나쁜 습관이라고 생각합니다. – Gama11