Scala Option模式与案例类匹配

时间:2016-03-29 11:56:30

标签: scala pattern-matching type-inference

我得error: value id is not a member of Nothingcase Some(x) => x.id。这不应该评估为Some类型。

case class UserDbEntry(id: Int, username: String)

val users = List()
val lastTableIds = "user.1::paypal.1"
val lastUserId   = lastTableIds.split("::")(0).split("\\.")(1)

//This does not compile
val id = users.lastOption match {
  case Some(x) => x.id
  case None => lastUserId
}

//This compiles
def getLastFetchId(x: Option[UserDbEntry]) = x match {
  case Some(user) => user
  case None => 1
}

但是使用显式类型List[UserDbEntry]定义List这很好,在这种情况下编译器会成功推断出这种情况。我想这与编译器推理有关;如果我没错。只是如果存在类型不匹配的话,我预计与x不符合String类型成员的错误。

这到底发生了什么?

1 个答案:

答案 0 :(得分:4)

宣布:

val users = List()

编译器推断:

val users: List[Nothing] = List()

Nothing没有id属性。但是,当您指定用户是List[UserDbEntry]并调用lastOption时,编译器可以理解Option中的元素是UserDbEntry,它具有id属性,因此编译得很好。考虑到空列表将返回None,这是Option[Nothing]