我试图从字符串中检索用于创建enum的case对象。
参考Extracting field from Some in Scala
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)
}
下面的代码使我能够从Some(TypeA)
检索值
var s=types.getType('A)
方法1
s match{
case Some(value)=>print(value.code)
}
方法2
print(s.fold {-1} { x => x.code })
以下是查询
None
。发布于 2017-08-13 02:38:32
我不清楚第二种方法,有人能解释一下折叠在这里是如何工作的吗?
这是fold
的签名
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
第一个参数ifEmpty
是在Option
为空的情况下将返回的“默认值”值,而第二个参数f
是在选项包含的值上执行的函数(如果它存在的话)。
opt.fold(a)(f)
则等价于
opt.map(f).getOrElse(a)
或
opt match {
case None => a
case Some(v) => f(v)
}
如果找不到匹配,我希望使用默认类型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)
}
发布于 2017-08-13 05:37:47
s.foreach(println(_.code))
s
是None
时,它会崩溃。您应该添加一个case
子句来匹配这种情况(但在本例中,您最好只使用foreach
)。s.fold {-1} { x => x.code }
等价于s.map(_.code).getOrElse(-1)
None
,则只需执行println(s.getOrElse(DefaultType).code)
https://stackoverflow.com/questions/45659351
复制相似问题