2017-04-25 3 views
2

Ich möchte eine Log-Annotation Verwendung scala meta.Usage tun einfach wie:Wie bekomme ich einen Methodenrückgabetyp mit Scala-Meta-Annotation?

@Log 
def f1(a: Int) { 
    Future(a + 1) //result is a Future 
} 

// after parsed ====> 
def f1(a: Int) { 
    Future(a + 1).map{x => 
     println(x) 
     x 
    } 
} 

Wie kann ich überprüfen, ob f1 eine Art Future[ _ ] ist? Danke
Außerdem möchte ich keine Reflektion (Performance-Kosten) in Log Annotation verwenden und ich denke, Methode Ergebnis Typ kann zur Kompilierzeit entschieden werden.

+0

Ich bin unsicher, was Sie versuchen zu überprüfen, was soll @Log tun? Warum kann man nicht eine Funktion def wie 'def f1 [A] (a: Int) verwenden: Future [A] = ???' dann wird es Kompilierzeit fehlschlagen, wenn es keine Zukunft ist –

+0

@ LeMoN.xaH, danke deinen Rat. Aber ich möchte das Ergebnis der Methode als Log-Information ausgeben. Wenn das Ergebnis "Zukunft" ist, sind die sinnvollen Dinge Ausdruck "Zukunft" ist der Wert eher Zukunft selbst. :-) Also benutze ich Macro eine 'map' Operation, wenn die Methode einen Future Wert zurückgibt. – LoranceChen

+1

Sie können separate Protokollanmerkungen für synchrone und asynchrone Methoden erstellen. Bitte beachten Sie die folgende Implementierung, die wahrscheinlich Ihre Usecase abdecken: https://github.com/euengarkusha/macroLogging –

Antwort

1

Dies ist mit Scalameta-Makroannotationen nicht möglich. Die Makroanmerkungen sind syntaktisch, so dass sie keinen Zugriff auf semantische Informationen wie Baumtypen haben.

PS. Ich bin nicht sicher, ob eine Makro Anmerkung für diesen Anwendungsfall geeignet ist, können Sie die Log-Anweisung explizit mit so etwas wie diese

def log[T](x: T): T = { println(x); x } 
Future(1).map(log) 

oder noch kurz mit einer Erweiterungsmethode schreiben

implicit class XtensionFuture[T](future: Future[T]) { 
    def logged: Future[T] = future.map(log) 
} 
Future(1).logged 

Makros sollten idealerweise als letztes Mittel verwendet werden, nicht nur für die Bequemlichkeit.

+0

Hallo, ich möchte http Anfrage Invoke-Kette protokollieren, die alle wichtigen Kontext Informationen der Methode enthält. Schreiben von Hand überall mit 'log.info/warning/error' ist sehr langweilig in der situation.Is scalameta wird semantische info in späteren roadmap? – LoranceChen

+0

Ich gerade gefunden [this] (https://github.com/scalameta/scalameta/issues/604) .Ist semantische Informationen Zugriff möglich, wenn es fertig ist? – LoranceChen

+0

Makro-Annotationen werden wahrscheinlich auch nach der Einführung der semantischen API syntaktisch bleiben. Müsstest du die log.info immer noch mit dem von mir vorgeschlagenen ".logged" Ansatz von Hand schreiben? Scala hat viele Werkzeuge, um über den Standard zu abstrahieren, Makros sind wirklich die letzte Verteidigungslinie und sollten wenn möglich vermieden werden. –