从 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 })

查询如下

  1. 我不清楚第二种方法 谁能解释一下如何折叠 在这里工作
  2. 我想使用默认类型的案例对象来表示 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)
 }
  1. 如果只是想把内容打印出来,方法是s.foreach(println(_.code))

  2. s match{
     case Some(value)=>print(value.code)
    }
    

    是个坏主意,因为当 sNone 时它会崩溃。你应该添加一个 case 子句来匹配这种情况(但同样,在这种情况下你最好只使用 foreach )。

  3. s.fold {-1} { x => x.code } 等同于 s.map(_.code).getOrElse(-1)

  4. 如果你想要默认类型而不是 None 你可以只做 println(s.getOrElse(DefaultType).code)