2012-10-30 34 views
-1

打印表達的準確名稱,我不知道如何從拋出的異常在我的代碼打印表達的確切名稱:http://pastie.org/private/jfszprszt7uxng2ajahcg如何從拋出的異常斯卡拉

我需要的是什麼它打印WrongTypeInExpression(BinOp("+",Var("b"),IntLit(12)))但實際上它打印WrongTypeInExpression(BinOp(+,Var(b),IntLit(12)))

請問您能幫我嗎?

我曾試圖改變這些事情,但他們產生相同的結果:

case e:WrongTypeInExpression => println("WrongTypeInExpression(" + e.expr.toString() + ")") 
+2

這不是_The確切名_。那是引發exception_的源代碼。無論如何,如果你不喜歡case類如何打印出來,你可以手工重寫它們的'toString'方法。 –

+0

你能告訴我你的toString實現嗎? 謝謝你的回答:)。 –

+0

我沒有'toString'實現。我只是指出你可以寫一個你想要的東西。 –

回答

2

只是爲了顯示這個問題的目的,您的pastie.org代碼可以簡化爲:

trait Expr 
case class BinOp(op: String, left: Expr, right: Expr) extends Expr 
case class IntLit(value: Int) extends Expr 
case class Var(name: String) extends Expr 

println(BinOp("+", Var("b"), IntLit(12))) // prints BinOp(+,Var(b),IntLit(12)) 

正如Rex Kerr在他的評論中指出的那樣,您可以簡單地重寫toString(它在上面的println中默默地調用,將其所有參數轉換爲可打印的值)以執行您想要的操作。

trait Expr 
case class BinOp(op: String, left: Expr, right: Expr) extends Expr { 
    override def toString : String = "BinOp(\"" + op + "\", " + left.toString + ", " + right.toString + ")" 
} 
case class IntLit(value: Int) extends Expr 
case class Var(name: String) extends Expr { 
    override def toString : String = "Var(\"" + name + "\")" 
} 

現在,你希望:

scala> println(BinOp("+", Var("b"), IntLit(12))) 
BinOp("+", Var("b"), IntLit(12)) 
+0

謝謝Paolo Falabella :)。 –