我有这段代码
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[_]
?答案 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
,所以编译器解释它的方式很有意义。