使用此代码:
for {
id1 <- invDAO.save(inv)
} yield {
println(s"id1, $id1")
}
我得到:id1, Right(7f5c7a58-8caa-4329-8a21-df27ed5d661b)
如何访问id值?
答案 0 :(得分:3)
Right
是Either
的两个子类型之一(另一个是Left
)。
Either
类似于两个Option
类型(其中Some
和None
为其子类型)。就像Option
用于捕获方法可能具有空结果的想法一样,Either
用于返回结果(在Right
中)或错误值(在Left
)。
您应该匹配invDAO.save(inv)
的返回值,看它是否返回Right
或Left
,并正确处理结果。例如:
invDAO.save(inv) match {
case Right(id1) => println(s"id1, $id1")
case Left(msg) => println(s"An error occurred: $msg")
}
修改 - 如果invDao.save(inv)
实际上返回Seq
Either
之类的内容,那么您可以使用for
:
for (result <- invDao.save(inv)) result match {
case Right(id1) => println(s"id1, $id1")
case Left(msg) => println(s"An error occurred: $msg")
}
答案 1 :(得分:0)
您可以更改代码以匹配save
:
for {
Right(id1) <- invDAO.save(inv)
} yield {
println(s"id1, $id1")
}
会打印id1, 7f5c7a58-8caa-4329-8a21-df27ed5d661b
当然 - 这只适用于确实与模式匹配的返回值,即Right
的实例。如果返回Left
,您将不会获得任何匹配项,也不会打印任何内容。