我试图从字符串中检索用于创建枚举的案例对象
sealed trait Mapping {def code: Int;def desc: Symbol}
object types {
case object TypeA extends Mapping {
val code = 0;
val desc = 'A
}
case object TypeB extends Mapping {
val code = 1;
val desc = 'B
}
val values=List(TypeA,TypeB)
def getType(desc: Symbol) =
values.find(_.desc == desc)
}
Run Code Online (Sandbox Code Playgroud)
下面的代码使我能够从中回溯价值 Some(TypeA)
var s=types.getType('A)
Run Code Online (Sandbox Code Playgroud)
方法1
s match{
case Some(value)=>print(value.code)
}
Run Code Online (Sandbox Code Playgroud)
方法2
print(s.fold {-1} { x => x.code })
Run Code Online (Sandbox Code Playgroud)
以下是查询
None没有找到匹配项我不清楚第二种方法任何人都可以解释折叠是如何工作的
这是以下的签名fold:
def fold[B](ifEmpty: ? B)(f: (A) ? B): B
Run Code Online (Sandbox Code Playgroud)
第一个参数ifEmpty是"默认"值,如果Option为空则返回,而第二个参数f是在Option包含的值上执行的函数(如果它在那里).
opt.fold(a)(f)
Run Code Online (Sandbox Code Playgroud)
等于
opt.map(f).getOrElse(a)
Run Code Online (Sandbox Code Playgroud)
要么
opt match {
case None => a
case Some(v) => f(v)
}
Run Code Online (Sandbox Code Playgroud)
我希望使用默认类型的case对象来表示None,如果没有找到匹配项
你可以这样做:
sealed trait Mapping {def code: Int;def desc: Symbol}
object types {
case object TypeA extends Mapping {
val code = 0;
val desc = 'A
}
case object TypeB extends Mapping {
val code = 1;
val desc = 'B
}
case object DefaultType extends Mapping {
val code = -1
val desc = 'Default
}
val values = List(TypeA,TypeB)
def getType(desc: Symbol): Mapping =
values.find(_.desc == desc).getOrElse(DefaultType)
}
Run Code Online (Sandbox Code Playgroud)