0

どちらかが存在する場所でassertを使用すると、いくつかの厄介な問題に遭遇しました。

  • 利用できる良い情報がありません:なぜ失敗したのか、そしてアサートは何についてでしたか
  • アサーション情報は、スカラ関数のレイヤーが多すぎるなど、不要な情報の海に埋もれています。私はこれらの問題を頭の後ろに置いてきました。新しいscalaマクロが利用できるようになったので、Stack Overflowに進み、問題ごとに価値の高い質問と回答のペアを作成する予定です。そうすれば、問題を抱えている次の人は、それほど多くの誤った情報を調べなくて済みます。他の専門家が自分の知識でチャイムを鳴らした場合、私は私たちを悩ませたさまざまな問題についてさらに学ぶかもしれません。

これは単純なscalaマクロの例です。

4

1 に答える 1

1

これは、アサートの失敗に関する詳細を提供し、例外をスローするときに内部関数のすべてのscalaレイヤーを削除するソリューションです。

def assert2(c: Context)(act: c.Expr[Any],exp: c.Expr[Any]): c.Expr[Unit] = {
    import c.universe._
    val actm = act.tree.toString
    val expm = exp.tree.toString
    reify({
        if(act.splice!=exp.splice) {
            try {
                throw new Exception("AssertionError: "+c.Expr[String](Literal(Constant(actm))).splice+"["+act.splice+"]==["+exp.splice+"]"+c.Expr[String](Literal(Constant(expm))).splice)
            } catch {
            case unknown: Throwable => System.err.println(""+unknown+unknown.getStackTrace.toList.filter(_.toString.indexOf("scala.")!=0).mkString("\n  ","\n  ","\n  ")); exit
            }
        }
    })
}
def myAssert2(act: Any, exp: Any) = macro assert2
于 2013-02-15T11:44:22.700 に答える