首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从scala中检索值

从scala中检索值
EN

Stack Overflow用户
提问于 2017-08-13 10:24:46
回答 2查看 2K关注 0票数 2

我试图从字符串中检索用于创建enum的case对象。

参考Extracting field from Some in Scala

代码语言:javascript
代码运行次数:0
运行
复制
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)检索值

代码语言:javascript
代码运行次数:0
运行
复制
     var s=types.getType('A)

方法1

代码语言:javascript
代码运行次数:0
运行
复制
  s match{
    case Some(value)=>print(value.code)
  }

方法2

代码语言:javascript
代码运行次数:0
运行
复制
     print(s.fold {-1} { x => x.code })

以下是查询

  1. 我不清楚第二种方法,有人能解释一下折叠在这里是如何工作的吗?
  2. 如果找不到匹配,我希望使用默认类型case对象来表示None
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-13 10:38:32

我不清楚第二种方法,有人能解释一下折叠在这里是如何工作的吗?

这是fold的签名

代码语言:javascript
代码运行次数:0
运行
复制
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B

第一个参数ifEmpty是在Option为空的情况下将返回的“默认值”值,而第二个参数f是在选项包含的值上执行的函数(如果它存在的话)。

代码语言:javascript
代码运行次数:0
运行
复制
opt.fold(a)(f)

则等价于

代码语言:javascript
代码运行次数:0
运行
复制
opt.map(f).getOrElse(a)

代码语言:javascript
代码运行次数:0
运行
复制
opt match {
  case None => a
  case Some(v) => f(v)
}

如果找不到匹配,我希望使用默认类型case对象来表示None。

你可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
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)
 }
票数 6
EN

Stack Overflow用户

发布于 2017-08-13 13:37:47

  1. 如果您只想打印内容,那么方法是s.foreach(println(_.code))
  2. S匹配{ 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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45659351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档