11
我正在嘗試使用Scala(2.9.0)延續來構建看似阻塞的API,但實際上它是異步的。假設你希望寫類似:對非阻塞API使用Scala延續
if(ask("Continue?")) //Prompts Yes/No
name = input("Enter your name")
凡ask
,當用戶按下是返回一個布爾值,並input
請求的值。從網絡服務器調用這個圖片,其中ask
和input
不會阻塞任何線程,它們只是在顯示包含提示的頁面(釋放大部分資源)之前將一個延續存儲在一個Map(或會話中,無關緊要) 。當迴應回來時,它會查找地圖中的延續並恢復代碼。
到目前爲止的問題是,我似乎無法找到一個合適的方式來定義ask
和input
使用continuations而不傳遞調用上下文的返回類型作爲參數。
我得到的最接近的是做這樣的事情:
#!/bin/sh
exec scala -P:continuations:enable -deprecation "$0" "[email protected]"
!#
import util.continuations._
//Api code
def display[T](prompt: String) = shift {
cont: (Unit => T) => {
println(prompt)
cont()
}
}
//Client code
def foo() : Int = reset {
display[Int]("foo!") // <-- how do I get rid of the type annotation?
5
}
def bar() : Unit = reset {
display[Unit]("bar!")
}
println(foo())
bar()
我真的想獲得對通話擺脫類型的註釋來display
。有沒有人知道實現這一目標的方法?我不關心API定義是否越來越醜,只要客戶端代碼變得更簡單。 謝謝!
將答案發布爲答案。 –
不知道我可以! – juancn