Scala Try [Unit]混乱

时间:2018-08-06 02:18:34

标签: scala types try-catch

我有这段代码

import scala.util.Try
val t: Try[Unit] = Try(Try(1))

和2个问题:

  • 这是怎么回事?类型Try[Try[Int]]如何与 Try[Unit]?是因为Scala选择了代码块的返回类型 Try(1)成为Unit才能与所需类型匹配?
  • 反正有检测嵌套的Try吗?说我有一个Try[A],我怎么知道A是否是另一个Try[_]

2 个答案:

答案 0 :(得分:5)

您基本上是在强迫编译器将Try分配为Unit

例如,下面的示例doSomething应该返回Int,因为这是最后一条语句,但是返回类型Unit迫使它返回()

scala> def doSomething: Unit = 1 + 1
doSomething: Unit

在您的示例val t: Try[Unit] = Try(Try(1 / 0))中,您要求编译器将内部Try(1 / 0)视为Unit;这意味着

scala> val innerTry: Unit = Try(1 / 0)
innerTry: Unit = ()

这意味着即使Try失败,它的Unit也始终是您拥有的另一个Success的{​​{1}}。

Try

最好删除您要提供的特定类型,并让编译器找出来,

scala> val t: Try[Unit] = Try(someOperation)
t: scala.util.Try[Unit] = Success(())

也请阅读:Scala: Why can I convert Int to Unit?

scala> val t = Try(Try(1 / 0))
t: scala.util.Try[scala.util.Try[Int]] = Success(Failure(java.lang.ArithmeticException: / by zero))

答案 1 :(得分:1)

public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { //show typing var reply = activity.CreateReply(String.Empty); reply.Type = ActivityTypes.Typing; ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); await connector.Conversations.ReplyToActivityAsync(reply); ... } 返回Try(1)Success(1)返回Try(Try(1),因为它已分配给类型Success(()) 类似于Scala REPL中的以下命令,其中x被强制采用Try[Unit]类型:

Unit

因此显然,编译器正在获取返回值,并被迫键入scala> val x = 5 x: Int = 5 scala> val x:Unit = 5 <console>:23: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses val x:Unit = 5 ^ x: Unit = () scala> ,即()。 因为可能是Unit,所以编译器解释它的方式很有意义。