我想向Scala Enumeration添加两个新操作,以便在给定特定值(如果存在)的情况下获取上一个和下一个值。例如,我想写一些类似的东西:
object Nums extends MyNewEnumerationType {
type Nums = Value
val One,Two,Three = Value
}
Nums.nextOf(One) // Some(Two)
Nums.prevOf(One) // None
我的想法是创建一个新类并以这种方式添加方法:
class PrevNextEnum extends Enumeration {
val prevOf = values.zip(None +: values.map{_.some}.toSeq).toMap
val nextOf = {
if (values.isEmpty) Map.empty
else values.zip(values.tail.map{_.some}.toSeq :+ None).toMap
}
}
问题是这不起作用,因为初始化prevOf
和nextOf
时,values
为空。
第一个问题:为什么values
为空,何时填充了值?
第二个问题:我如何实施prevOf
和nextOf
?
第三个问题:是否可以将方法prevOf
和nextOf
添加到值类型而不是枚举?写One.next
感觉比写Num.nextOf(One)
答案 0 :(得分:1)
尝试以下代码:
class PrevNextEnum extends Enumeration {
lazy val prevOf = {
val list = values.toList
val map = list.tail.zip(list.map(Some(_))).toMap + (list.head -> None)
map
}
lazy val nextOf = {
val list = values.toList
val map = (list.zip(list.tail.map(Some(_)) :+ None).toMap)
map
}
}
object Nums extends PrevNextEnum {
type Nums = Value
val One, Two, Three = Value
}
object App extends App {
println(Nums.prevOf(Nums.Two))
println(Nums.nextOf(Nums.One))
println(Nums.nextOf(Nums.Three))
println(Nums.prevOf(Nums.One))
}
答案 1 :(得分:1)
基于user1484819的答案:
class PrevNextEnum extends Enumeration {
lazy val prevOf = {
val list = values.toList
val map = list.tail.zip(list).toMap
v:Value => map.get(v)
}
lazy val nextOf = {
val list = values.toList
val map = list.zip(list.tail).toMap
v:Value => map.get(v)
}
}
object Nums extends PrevNextEnum {
type Nums = Value
val One, Two, Three = Value
}
这具有基本相同的结构,但使用Map
在使用Options
而不是get
时可以返回apply
的事实。