Scala中嵌套重置的示例

时间:2011-06-08 15:29:10

标签: scala reset continuations

这是关于Scala延续的问题。 resets可以嵌套吗?如果他们可以:嵌套resets对什么有用?是否有嵌套resets

的示例

2 个答案:

答案 0 :(得分:6)

是的,reset可以嵌套,是的,它可能很有用。作为一个例子,我最近为scalagwt project原型化了一个API,它允许GWT开发人员以直接样式编写异步RPC(远程过程调用)(与GWT for Java中使用的回调传递样式相反) )。例如:

field1 = "starting up..."                   // 1 
field2 = "starting up..."                   // 2 
async {                                     // (reset)
   val x = service.someAsyncMethod()        // 3 (shift)
   field1 = x                               // 5 
   async {                                  // (reset)
      val y = service.anotherAsyncMethod()  // 6 (shift)
      field2 = y                            // 8 
   } 
   field2 = "waiting..."                    // 7 
} 
field1 = "waiting..."                       // 4 

评论表明执行顺序。在这里,async方法执行reset,每个服务调用执行shift(您可以在my github fork上看到实施,特别是Async.scala)。< / p>

注意嵌套async如何更改控制流。没有它,行field2 = "waiting"将在成功完成第二个RPC之后才会执行。

当创建RPC时,实现会捕获到最内层async边界的延续,并在成功完成RPC后暂停它以便执行。因此,嵌套的async块允许控件在第二次RPC生成后立即流到其后的行。另一方面,如果没有嵌套块,延续将一直延伸到外部async块的末尾,在这种情况下,外部async内的所有代码都会阻塞每个RPC。

答案 1 :(得分:1)

reset形成一个抽象,以便外部代码不受内部代码用continuation魔术实现的事实的影响。因此,如果您使用复位和移位编写代码,它可以调用其他代码,这些代码可能也可能不会通过复位和移位实现。从这个意义上讲,它们可以嵌套。