問題を表示するためだけに、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))