2017-06-28 1 views
2

Gibt es eine Möglichkeit, eine null als Ergebnis eines "Makrofunktionsaufrufs" auf die aufrufende Instanz zu setzen?Haxe-Makro, um null auf aufrufende Instanz zu setzen?

Wie so:

class A { 
    // ... 
    macro function DestroyItself() { 
     // ... 
    } 
} 

var a:A = new A(); 
// ... 
a.DestroyItself(); 
trace(a); // "null" 

Antwort

4

Yep:

macro public function destroy(self:Expr) { 
    return macro $self = null; 
} 
// ... 
a.destroy(); 

In nicht-statische Makrofunktionen erste Expr Argument ist ein ref-Instanz an Anrufer.

+0

'Makro public function destroy (self: haxe.macro. Expr) {... '* * oder ** 'import haxe.macro.Expr;' – madneon

3

Sobald Ansatz wäre, generische Werkzeuge zu null jeder Instanz zu erstellen.

package ; 

class Tools 
{ 
    /** 
    * Simply assigns null to the instance 
    * See more at: http://code.haxe.org/category/macros/generating-code-in-a-macro.html 
    * 
    * @param instance - Any 
    * @return haxe.macro.Expr 
    */ 
    public static macro function nullMe(instance : haxe.macro.Expr.ExprOf<Dynamic>) : haxe.macro.Expr 
    { 
     return macro { 
      ${instance} = null; 
     }; 
    } 
} 

verwenden Dies ist die using Tools; generisch null jede Instanz, aber ich würde dieses nicht empfehlen. Ich würde den Ansatz pro Klasse verwenden.

Main.hx

package ; 

class Main { 

    static function main() { 
     // Construct 
     var instance = new SomeClass(); 

     // Destroy 
     instance.destroy(); 

     // Trace null 
     trace(instance); 
    } 
} 

SomeClass.hx

package ; 

class SomeClass 
{ 
    public function new() 
    { 
     trace("Hello from SomeClass!"); 
    } 

    private function preDestroy() 
    { 
     trace("The end is nigh!"); 
    } 

    public macro function destroy(self : haxe.macro.Expr) : haxe.macro.Expr 
    { 
     return macro { 
      @:privateAccess ${self}.preDestroy(); 
      ${self} = null; 
     }; 
    } 
} 

Zusammengestellt JS

// Generated by Haxe 3.4.2 
(function() { "use strict"; 
var Main = function() { }; 
Main.main = function() { 
    var instance = new SomeClass(); 
    instance.preDestroy(); 
    instance = null; 
    console.log(instance); 
}; 
var SomeClass = function() { 
    console.log("Hello from SomeClass!"); 
}; 
SomeClass.prototype = { 
    preDestroy: function() { 
     console.log("The end is nigh!"); 
    } 
}; 
Main.main(); 
})(); 
+0

Bei '@: privateAccess $ {self} .preDestroy();' Ist es möglich zu überprüfen, ob die Klasse die 'preDestroy'-Funktion hat? – madneon

+0

Es sollte geradlinig genug sein, aber ich denke nicht, dass du es brauchen wirst, da das Zerstörungsmakro auf der Klasse implementiert ist. Es ist also sicher anzunehmen, dass es da sein wird. – matanube

+0

Ich würde vorsichtig sein, wenn Sie diese Art von Lösung verwenden. Es könnte zu "schwer lesbarem" Code führen. Beim Zerstören von Dingen ist das Auflösen der Referenz (en) der letzte Schritt. Hinzu kommt, dass das Nullen einer lokalen Variablen nutzlos wäre. – matanube

Verwandte Themen