我想获得scala中几个Option之一的值,如下所示:
def or(a:Option[Int], b:Option[Int]):Option[Int]=
if (a.isDefined) a else b
val a= Option(1)
val b= Option(2)
or(a,b).get
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么||运营商没有为Option定义?有没有更惯用的方法呢?
我可以在不参考类的实际对象的情况下检查伴随对象中的字段值吗?
我想存储一个静态计数器,每次创建该类的新对象时都增加它,并且能够在不使用对象本身的情况下检查它的值,这可能吗?
我有一个Scala Option[T].如果值是Some(x)我想用一个不返回值(Unit)的进程处理它,但如果是None,我想打印一个错误.
我可以使用下面的代码要做到这一点,但我明白,更习惯的方法是治疗Option[T]的顺序和使用map,foreach等我该怎么办呢?
opt match {
case Some(x) => // process x with no return value, e.g. write x to a file
case None => // print error message
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{
topComponent = s1.merge
bottomComponent = s2.merge
def containsV(orig: MapCanvT): Option[MapCanvT] =
{
def containsIn(cn: CanvNode): Option[MapCanvT] = cn match
{
case Left => None
case Right(mc) => if (mc == orig) Some(mc) else None
}
containsIn(s1) match
{
case Some(mc) => Some(mc)
case None => containsIn(s2)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想减少containsV方法的代码.我的第一个想法是使用fold方法来缩短containsIn方法.但Option没有一个,也没有扩展Class Either.Option [T]不应该扩展[T,None]吗?然后至少有一个可以使用Either的折叠方法.
我最后的想法是将s1和s2视为一个List并找到它但我无法编译:
def containsV(orig: MapCanvT):
Option[MapCanvT] = ::[CanvNode](s1, s2).find(_ == Right(orig))
Run Code Online (Sandbox Code Playgroud) 我想用if语句替换下面的匹配,最好比这更简洁.我个人觉得是否更容易在头脑中解析.
val obj = referencedCollection match{
case None => $set(nextColumn -> MongoDBObject("name" -> name))
case Some( collection) =>....}
Run Code Online (Sandbox Code Playgroud)
是否有等效的if语句或其他产生等效结果的方法?