Scala Either:获取左右存在的属性的最简单方法

时间:2016-07-06 11:03:24

标签: scala either

我有一个使用valueObject的模板,它可能是两种风格中的一种,具体取决于它在我们的应用程序中使用的位置。所以我将其导入为Either:

valueObject: Either[ ObjectA, ObjectB ]

两个对象都有相同的命名属性,所以我想通过调用

来检索它
valueObject.propertyA

哪个不起作用。

最简洁/最好的方式是什么?

2 个答案:

答案 0 :(得分:7)

假设两个对象具有定义该属性的相同类型(或超类型/特征) - 您可以使用$(document).ready(function() { var c = document.getElementById("ComplexPlane"); var number = c.getContext("2d"); number.beginPath(); number.arc(500+50*realPart,300-50*imagPart,10,0,2*Math.PI); number.stroke(); number.fill();}) ,如果它存在则返回左侧,否则,使用两者的最低公共类型: / p>

merge

答案 1 :(得分:2)

使用fold

假设这两个对象不共享一个包含属性/方法的常用超类型,那么你必须诉诸fold

scala> case class A(a: Int)
defined class A

scala> case class B(a: Int)
defined class B

scala> def foldAB(eab: Either[A,B]): Int = eab.fold(_.a,_.a)
foldAB: (eab: Either[A,B])Int

scala> foldAB(Left(A(1)))
res1: Int = 1

scala> foldAB(Right(B(1)))
res2: Int = 1

模式匹配

另一种可能性是使用模式匹配:

scala> def matchAB(eab: Either[A,B]): Int = eab match { case Left(A(i)) => i; case Right(B(i)) => i}
matchAB: (eab: Either[A,B])Int

scala> matchAB(Left(A(1)))
res3: Int = 1

scala> matchAB(Right(B(1)))
res4: Int = 1