別のクラスのいくつかのクロージャのためにメモ処理を実装しようとしています。しかし、私はそれを機能させることができません。パラメータを指定しないで閉じますmemoizationはcall()でのみ機能します
.call()
を使用してクロージャを呼び出すと、メモの設定が正しく機能します。しかし、私は通常の方法のようにそれを呼び出すときに動作しません。
コード:
public class Tester {
static main (String[] args){
Sample sample = new Sample();
println sample.printer.call(); \\works
println sample.printer.call(); \\works
sample = new Sample();
println sample.printer(); \\does not work
println sample.printer(); \\does not work
}
}
class Sample{
def printer= {
println "inside"
true;
}.memoize();
}
コンソールログ:
inside
true
true
Caught: groovy.lang.MissingMethodException: No signature of method: org.codehaus.groovy.runtime.memoize.Memoize$MemoizeFunction.doCall() is applicable for argument types:() values: []
Possible solutions: call(), call([Ljava.lang.Object;), call(java.lang.Object), call([Ljava.lang.Object;), equals(java.lang.Object), isCase(java.lang.Object)
groovy.lang.MissingMethodException: No signature of method: org.codehaus.groovy.runtime.memoize.Memoize$MemoizeFunction.doCall() is applicable for argument types:() values: []
Possible solutions: call(), call([Ljava.lang.Object;), call(java.lang.Object), call([Ljava.lang.Object;), equals(java.lang.Object), isCase(java.lang.Object)
at Tester.main(Tester.groovy:12)
このため、私は今call()
を使用して、すべての私の閉鎖呼び出しを変更する必要があります。同じことが私の通常のメソッド呼び出しを達成できるかどうか私に教えてください。私は解決策、私ができる最善を与えることができるのが大好きです
おかげで男のthats場合は、開始時刻に何とかそれを実行しようと見ています。メタクラスメソッドを試してみます。直接呼び出しはもっとうまくいくでしょうが、これはうまくいかないのでどこでも 'call() 'を使うことに決まります。 – v1shnu
もちろん、あなたのグルーヴィーバージョンをパッチしてコンパイルして、doCallをmemoizeクロージャーバリアントに導入することができます。グルーヴィーバグのチケットを発行することは良い考えです。 – norganos
metaClassを持つバリアントは、プログラムの開始時にのみ必要です。その後、あなたはメモの付いたクロージャを直接呼び出すことができます – norganos