从scala中的Some检索值

cod*_*r25 2 scala case-class

我试图从字符串中检索用于创建枚举的案例对象

参考 Scala中Some的Extracting字段

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)

以下是查询

  1. 我不清楚第二种方法任何人都可以解释折叠是如何工作的
  2. 我希望使用默认类型的case对象来表示 None没有找到匹配项

Gab*_*lla 5

我不清楚第二种方法任何人都可以解释折叠是如何工作的

这是以下的签名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)