如何从任一返回Right类?

时间:2018-12-15 16:37:35

标签: scala

如果我有一个返回Either的方法

def myMethod(s: String): Either[List[SomethingElse], Color] = {
 ....
}

我有一个这样的案例类:

case class ColorShade (color: Color, shade: Shade = Shade())

如何从Color返回myMethod并将其分配给color中的ColorShade。以下无效:

Color(Right(myMethod(someString)))

3 个答案:

答案 0 :(得分:0)

如果您不关心其他任何事情,并且对引发异常的风险感到满意,则可以执行以下操作:

ColorShade(myMethod("someString").toOption.get)

但是,这不是惯用方法,也不是推荐的方法。

如果您可以考虑合理的默认值,则可以执行以下操作:

val defaultColor : Color = ???
ColorShade(myMethod("someString").getOrElse(defaultColor))

最惯用的方法可能是更改使用ColorShade来接受Either[List[SomethingElse], ColorShade]的内容。这样做的好处是,在Left的情况下,您可以保留信息(也许出于错误记录的目的)。为此,您可以执行以下操作:

myMethod("someString").map(color => ColorShade(color))

这将是Either[List[SomethingElse], ColorShade]类型。另外,如果您不需要Left信息,则可能仍想执行toOption将其转换为Option[ColorShade]

答案 1 :(得分:0)

通常要做的是在其上进行映射,以使最终结果也为Either:

myMethod(someString).right.map(c => ColorShade(c, someShade))

这将返回Either[List[SomethingElse], ColorShade]

注意:从Scala 2.12开始,您可以删除.right部分,因为Either现在是右偏的。

答案 2 :(得分:0)

由于Either是右偏的,因此您可以这样做。

myMethod("string").map(ColorShade(_, shadeValue))

结果为Either[List[SomethingElse],ColorShade]

使用fold可能更惯用,您可以在其中指定myMethod()返回Left时发生的情况。

myMethod("string").fold(se => /*do something with the SomethingElse list*/
                       , ColorShade(_, shadeValue))