假设,有reset
一个单一的块shift
:
val r = 重置 { // 做某事。1 转移 {...} // 做某事。2 // 做某事。3 }
我shift
在 "do smth. 2" 或 "do smth. 3" 之后放置而不改变结果是否正确r
?shift
块中的位置无关紧要是否正确reset
?
假设,有reset
一个单一的块shift
:
val r = 重置 { // 做某事。1 转移 {...} // 做某事。2 // 做某事。3 }
我shift
在 "do smth. 2" 或 "do smth. 3" 之后放置而不改变结果是否正确r
?shift
块中的位置无关紧要是否正确reset
?
这在很大程度上取决于您在shift
. 如果您只是像这样调用提供的函数:shift((k: Unit => Unit) => k(Unit))
那么,在您的特定示例中,它的位置实际上并不重要shift
。
Shift
函数只是捕获其他函数中的代码(在我的示例中,此函数称为k
)。换句话说,这段代码:
val r = reset {
// do smth. 1
shift((k: Unit => Unit) => k(Unit))
// do smth. 2
// do smth. 3
}
将由编译器以这样的方式重写(此代码仅演示一般概念,不应该显示编译器插件实际生成的内容):
val k = (Unit => Unit) => {
// do smth. 2
// do smth. 3
}
val r = {
// do smth. 1
k(Unit)
}
但是如果你有一些逻辑shift
,比如条件k
执行,那么它的位置真的很重要shift
。
希望这会有所帮助(我希望我能正确理解您的问题)
只是添加到已经给出的答案,你可以移动的地方shift
是在班次之前有代码还是在你传递给的函数内有代码shift
:
reset {
foo(); bar();
shift { k => stuff }
baz()
}
是相同的
reset {
foo();
shift { k => bar(); stuff }
baz()
}