返回相同的值类型,但成功/失败

时间:2015-03-28 13:15:45

标签: scala

我们说我有方法..

def foo(b: Bar): Try[Bar] = ???

Try只是一个占位符。 fooBar执行某些操作,然后返回一个值以指示成功/失败。我想用成功/失败指示返回原始值,所以当我有一个集合时,我可以知道哪些失败并成功,并对它们做了些什么。 Try并不适合我,因为Failure包含了一个例外(让我们说我不关心它失败的原因)。

我可以返回Either[Bar, Bar],但重复类型参数似乎是多余的。

有比这更好的选择吗?

2 个答案:

答案 0 :(得分:3)

Either[Bar, Bar](Boolean, Bar)是同构的,它们之间的选择只是一种品味。

我个人更喜欢Either,因为您可以通过模式匹配等获得更好的映射集合的操作,以及允许您编写的merge扩展方法{如果在某些情况下您不再需要区分成功和失败的结果,则{1}}获得results.map(_.merge)。我也发现了这个:

Seq[Bar]

比......更好:

val result: Either[Bar, Bar] = foo(input).toOption.toRight(input)

或替代方案,但您的里程可能会有所不同。

答案 1 :(得分:-2)

如果我理解你的问题:你的解决方案几乎就是你要实现的目标。

def foo(b: Bar): Try[Bar] = Try(...)
val succeed = foo(b).getOrElse()

成功中,您拥有所需的值,或者没有任何值(因为您不关心异常)。非常好的文章是:http://danielwestheide.com/blog/2012/12/26/the-neophytes-guide-to-scala-part-6-error-handling-with-try.html