私はスカラ(2.9.0)継続を使って一見妨げになるAPIを構築しようとしていますが、実際は非同期です。ユーザーがはいを押すと、input
が値を要求した場合ask
はブール値を返しますノンブロッキングAPIのためのスカラ継続の使用
if(ask("Continue?")) //Prompts Yes/No
name = input("Enter your name")
:あなたが何かを書きたいとしよう。これはWebサーバーから呼び出され、ask
とinput
はスレッドをブロックしません。プロンプトを表示して(ほとんどのリソースを解放して)ページを表示する前に、マップに継続を格納します(またはセッションは大したことではありません) 。また、応答が返ってくると、マップ内の継続をルックアップしてコードを再開します。
これまでのところ、ask
とinput
を定義して、呼び出しコンテキストの戻り値の型をパラメータとして渡さずに継続を使用する適切な方法を見つけることができないようです。
私が得た最も近い
は次のようなものをやっている:#!/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