假設,有一個reset
塊用單shift
:移位位於重置塊中的位置是否重要?
val r = reset { // do smth. 1 shift {...} // do smth. 2 // do smth. 3 }
它是正確的,我把經過「做未便2」或「做3水木清華」的shift
不改變結果r
? shift
代表reset
區塊在哪裏並不重要?
假設,有一個reset
塊用單shift
:移位位於重置塊中的位置是否重要?
val r = reset { // do smth. 1 shift {...} // do smth. 2 // do smth. 3 }
它是正確的,我把經過「做未便2」或「做3水木清華」的shift
不改變結果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()
}
是的,它確實有助於你理解我的questio正確。 – Michael 2011-05-31 05:33:12