【发布时间】:2015-07-17 02:12:48
【问题描述】:
我正在学习 Scala 宏并将其视为一种练习。
是否可以使用 Scala 宏来写下这样的东西(可能不完全是这个具体的语法,而是没有样板的东西)
enum DayOfWeek = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
并让它宏扩展成这样的东西?
class DayOfWeek private (val ord: Int) extends AnyVal {
def next: DayOfWeek = ord match {
case 0 => Tuesday
case 1 => Wednesday
case 2 => Thursday
case 3 => Friday
case 4 => Saturday
case 5 => Sunday
case _ => throw Error("Sunday does not have next")
}
override def toString: String = ord match {
case 0 => "Monday"
case 1 => "Tuesday"
case 2 => "Wednesday"
case 3 => "Thursday"
case 4 => "Friday"
case 5 => "Saturday"
case _ => "Sunday"
}
}
object DayOfWeek {
def count = 7
val Monday = new DayOfWeek(0)
val Tuesday = new DayOfWeek(1)
val Wednesday = new DayOfWeek(2)
val Thursday = new DayOfWeek(3)
val Friday = new DayOfWeek(4)
val Saturday = new DayOfWeek(5)
val Sunday = new DayOfWeek(6)
}
也许不一定使用连续的整数来表示枚举。例如,使用一些标志,我们可以将不超过 32 或 64 个替代项的枚举表示为位,并对其集合进行有效的未装箱实现(如 Int 或 Long)。
另一个令人信服的理由是我们还可以为 enum 的稍微不同的风格定制不同的方面,例如,在上面,我们可以为 enum 提供一些参数,以便 next 循环Sunday 上的错误。
【问题讨论】:
-
不直接相关,但这里stackoverflow.com/questions/1898932/… 和这里stackoverflow.com/questions/1321745/… 有很多有趣的事情
标签: scala enums metaprogramming value-type scala-macros