假设,有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()
}