说我有:
case class User(
id: Int,
firstName: String,
lastName: String,
age: Int,
gender: Option[String])
要声明选项值,我输入:
val x:Option[User] = Some(User(1,"x","x",13,Some("ss")))
如何访问x的成员,例如
x.age
我在上面的声明中得到以下错误
error: value age is not a member of Option[User]
x.age
这是远程可能吗
答案 0 :(得分:2)
如此多的答案......为了完整性,我认为使用选项(以及任何Monads)的一种很酷的方式是使用for-understanding。
for( user <- x ) yield user.age
它也适用于任意嵌套选项,例如:
case class Address(street: String, number: Option[Int])
case class User(name: String, addr: Option[Address])
val u = Some(User("foo", Some(Address("bar", Some(2)))))
for( user <- u; addr <- user.addr; n <- addr.number) yield n
答案 1 :(得分:1)
用于从monad检索数据的模式匹配的另一种方法是使用[
:
flatMap
我只是意识到这并没有真正回答你的问题,但除非有不同的意见,否则我仍会把它留在这里作为替代选择。
虽然保留上述答案,但我认为从选项获取值的更惯用的方法是x.flatMap(user => Option(user.age))
// res128: Option[Int] = Some(13)
:
getOrElse
或x.map(_.age).getOrElse(0)
// res140: Int = 13
:
get
答案 2 :(得分:1)
研究Scaladoc page for Option。有许多方法返回具体类型(即非monadic)。示例包括fold
,getOrElse
,head
,max
,product
,sum
等等。
None
上调用则会抛出错误)。最好使用在None
上调用时提供默认值的方法。 (fold
和getOrElse
很好。)
答案 3 :(得分:0)
您可以使用模式匹配
进行访问val x: Option[User] = Some(User(1,"x","x",13,Some("ss"))
x match {
case Some(user) => user.age
case None => 0
}
答案 4 :(得分:0)
您正在寻找的是模式匹配。它可以让您测试x
的类型。
你只需要写:
x match{
case None => /* Your code if it's None */
case Some(user) => /* Here user has type User, so you can call its methods */
}