2013-02-15 88 views
0

我使用的時候會遇到一些惱人的問題聲稱那裏是可以得增強斷言斯卡拉宏觀

  • 沒有良好的信息:它爲什麼失敗,什麼斷言約爲
  • 斷言信息被埋在海量的不需要的信息之下,像太多的scala函數層。 我已經將這些問題留在了我的腦海中,現在新的scala宏已經可用了,我打算繼續Stack Overflow併爲每個問題創建一個高價值的問題和答案對。那樣,下一個有這個問題的人就不必在這麼多的錯誤信息中s舌。如果其他專家用他們自己的知識加以引申,我甚至可以更多地瞭解困擾我們的各種問題。

這是一個簡單的scala宏示例。

回答

1

這裏是一個溶液在約斷言故障深度細節給予更多的和消除的內部功能的所有階層拋出異常時:

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