2017-12-30 28 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()では動作しない場合があります。トリックはjavacriptターゲットの実行時に動作し、しかしtoString()メソッドはdce(1)によって削除されます。あなたはどちらかを無効にDCE(私はjavascriptの目標のためにそれをお勧めしません)、または単に@: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

それはまだ/冗長だが、同じ最終結果につながる、と私は明示的に 'Std.string()' 'trace'で使用するためにそれを悪い習慣を検討します。 – Gama11