たとえば、プログラミング言語のパーザを書いていて、プログラムの木構造を次のように表現したいとします。
sealed trait Expression case class Addition(lhs: Expression, rhs: Expression) extends Expression case class Subtraction(lhs: Expression, rhs: Expression) extends Expression case class Multiplication(lhs: Expression, rhs: Expression) extends Expression case class Division(lhs: Expression, rhs: Expression) extends Expression case class Number(value: Int) extends Expression
これで問題はないのですが、Expression
はよく使われる単語なので、プログラムの他の部分と衝突する可能性があります。幸いScalaにはpackageがあるので、
package ast sealed trait Expression extends Expression case class Addition(lhs: Expression, rhs: Expression) extends Expression case class Subtraction(lhs: Expression, rhs: Expression) extends Expression case class Multiplication(lhs: Expression, rhs: Expression) extends Expression case class Division(lhs: Expression, rhs: Expression) extends Expression case class Number(value: Int) extends Expression
とすることは可能ですが、もっとわかりやすい方法として、object
で包むという方法が考えられます。上の定義をobject
を使って書き換えると、
object Ast { sealed trait Expression case class Addition(lhs: Expression, rhs: Expression) extends Expression case class Subtraction(lhs: Expression, rhs: Expression) extends Expression case class Multiplication(lhs: Expression, rhs: Expression) extends Expression case class Division(lhs: Expression, rhs: Expression) extends Expression case class Number(value: Int) extends Expression }
のようになります。参照するときは、Ast.Expression
、Ast.Subtraction
のようにすればOKです。
ではでは。