从 Scala 中的 Some 中检索值
Retrieve value from Some in scala
我正在尝试检索用于从字符串创建枚举的案例对象
参考自
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)
方法一
s match{
case Some(value)=>print(value.code)
}
方法二
print(s.fold {-1} { x => x.code })
查询如下
- 我不清楚第二种方法 谁能解释一下如何折叠
在这里工作
- 我想使用默认类型的案例对象来表示
None
如果找不到匹配项
I am not clear about the second approach Can anyone explain how fold is working here
这是fold
的签名:
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
第一个参数 ifEmpty
是在 Option
为空的情况下将返回的 "default" 值,而第二个参数 f
是获取的函数对选项包含的值执行(如果存在)。
opt.fold(a)(f)
等同于
opt.map(f).getOrElse(a)
或
opt match {
case None => a
case Some(v) => f(v)
}
I want use a default type case object to represent None in case no match is found
您可以这样做:
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)
}
如果只是想把内容打印出来,方法是s.foreach(println(_.code))
s match{
case Some(value)=>print(value.code)
}
是个坏主意,因为当 s
为 None
时它会崩溃。你应该添加一个 case
子句来匹配这种情况(但同样,在这种情况下你最好只使用 foreach
)。
s.fold {-1} { x => x.code }
等同于 s.map(_.code).getOrElse(-1)
如果你想要默认类型而不是 None
你可以只做 println(s.getOrElse(DefaultType).code)
我正在尝试检索用于从字符串创建枚举的案例对象
参考自 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)
方法一
s match{
case Some(value)=>print(value.code)
}
方法二
print(s.fold {-1} { x => x.code })
查询如下
- 我不清楚第二种方法 谁能解释一下如何折叠 在这里工作
- 我想使用默认类型的案例对象来表示
None
如果找不到匹配项
I am not clear about the second approach Can anyone explain how fold is working here
这是fold
的签名:
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
第一个参数 ifEmpty
是在 Option
为空的情况下将返回的 "default" 值,而第二个参数 f
是获取的函数对选项包含的值执行(如果存在)。
opt.fold(a)(f)
等同于
opt.map(f).getOrElse(a)
或
opt match {
case None => a
case Some(v) => f(v)
}
I want use a default type case object to represent None in case no match is found
您可以这样做:
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)
}
如果只是想把内容打印出来,方法是
s.foreach(println(_.code))
s match{ case Some(value)=>print(value.code) }
是个坏主意,因为当
s
为None
时它会崩溃。你应该添加一个case
子句来匹配这种情况(但同样,在这种情况下你最好只使用foreach
)。s.fold {-1} { x => x.code }
等同于s.map(_.code).getOrElse(-1)
如果你想要默认类型而不是
None
你可以只做println(s.getOrElse(DefaultType).code)