たとえば、プログラミング言語のパーザを書いていて、プログラムの木構造を次のように表現したいとします。
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です。
ではでは。