2017-04-25 9 views
2

私のように、単純なログ注釈使用Scalaのmeta.Usageを行いたい:f1Future[ _ ]タイプであればスカラーメタアノテーションを使用してメソッドの戻り値を取得する方法は?

@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 
    } 
} 

どうすれば確認できますか?ありがとう
また、Log注釈では反映(パフォーマンスコスト)を使用したくないので、コンパイル時にメソッドの結果の型を判断できると思います。

+0

この@Logが何をすべきかを確認しようとしていますか?なぜdef f1 [A](a:Int):Future [A] = ??? 'のような関数defを使用することができないのですが、将来は –

+0

@ LeMoN.xaHの時にコンパイルに失敗します。しかし、私がしたいのは、メソッドの結果をログ情報として出力することです。結果が「未来」である場合、有意義なことは未来そのものの価値を印刷することである。 :-)メソッドが未来の値を返すならば、マクロを 'map'演算を使って行います。 – LoranceChen

+1

syncメソッドとasyncメソッドに対して別々のログ注釈を作成することができます。 あなたのユースケースをカバーする可能性のある次の実装を考慮してください: https://github.com/eugengarkusha/macroLogging –

答えて

1

スケーラメタのマクロ注釈では不可能です。マクロ注釈は構文的なので、木の種類などの意味情報にアクセスすることはできません。

PS。私はマクロ注釈がこのユースケースに適しているかどうません確信して、あなたも、より簡潔拡張メソッド

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

この

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

など何かを明示的にログ文を書き出すことができマクロは理想的には便宜上のものではなく、最後の手段として使用する必要があります。

+0

こんにちは、私は重要なメソッドのコンテキスト情報をすべて含んでいるHTTPリクエストの呼び出しチェーンをログに記録したいと思います。 'log.info/warning/error'は非常に退屈です。スケーラメタはセマンティック情報を後のロードマップで公開しますか? – LoranceChen

+0

私は[this](https://github.com/scalameta/scalameta/issues/604)を見つけました。終了したらセマンティック情報にアクセスできますか? – LoranceChen

+0

マクロアノテーションは、セマンティックAPIの導入後でも構文的なままである可​​能性が高いです。私が提案した '.logged'アプローチで、どこでも手でlog.infoを書く必要がありますか? Scalaには、定型文を抽象化するためのツールがたくさんあります。マクロは実際には防衛の最終行であり、可能であれば避けるべきです。 –

関連する問題