0

「foreachexecute」を実行して出力している次のコードがあります。

val buf = ArrayBuffer[() => Unit]()
def add(o: () => Unit) = buf += o
add(() => print("executed "))
print("foreach ")
buf foreach (_())

3行目を簡略化したいのですが、最初の行で壊れています。

val buf = ArrayBuffer[=> Unit]()
def add(o: => Unit) = buf += o
add { print("executed ") }
print("foreach ")
buf foreach (_)

それを行う方法はありますか?

4

2 に答える 2

2

=>T名前による値 ( ) を割り当て可能なオブジェクトとして使用することはできません。メソッドへの引数としてのみ使用できます。つまり、ArrayBufferwith をパラメータ化することはできません=>Unit。でパラメータArrayBuffer化する必要があります() => Unit

名前値を関数値に「リフト」するには、() => ...構文を使用する必要があります。次のことができます。

val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += () => o
add { print("executed ") }
print("foreach ")
buf foreach (_())
于 2013-03-16T11:54:15.083 に答える
1

私があなたを正しく理解していれば、コードの一部を保存して後で評価する必要があります。この: => Type構文は、引数を名前で渡すために使用されます。つまり、引数が参照されるたびに (関数に渡す前ではなく) 評価されます。私の知る限り、評価を延期する唯一の方法は、その周りに何らかのラッパーを作成し、メソッド呼び出しを通じて評価を利用できるようにすることです。あなたの場合、単純な引数のない関数は素晴らしいラッパーになります:

val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += {() => o }
add(() => print("executed "))
print("foreach ")
buf foreach (_())
于 2013-03-16T11:54:05.630 に答える