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
function は、他の関数でその後に続くコードをキャプチャするだけです (私の例では、この関数は と呼ばれ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()
}