1

この質問は、Scala の暗黙的なパラメーターに相当する以前の Groovyの質問を拡張します。

これが前のトピックから発展させる正しい方法であるかどうかはわかりませんが、とにかく..

次のようなグルーヴィーなものを表現する方法を探しています。

// scala
object A {
    def doSomethingWith(implicit i:Int) = println ("Got "+i)
}
implicit var x = 5

A.doSomethingWith(6)  // Got 6
A.doSomethingWith     // Got 5

x = 0
A.doSomethingWith     // Got 0

一般に、ロジックの一部を実行し、その中の変数を実行の「コンテキスト」に基づいて解決したいと考えています。Scala の暗黙的要素を使用すると、このシナリオを制御できるようです。Groovyで同様のことを行う方法を見つけようとしています。

最初の質問からのフィードバックに基づいて、次のようにアプローチしようとしました。

// groovy
class A {
    static Closure getDoSomethingWith() {return { i = value -> println "Got $i" }} 
}

value = 5

A.doSomethingWith(6)  // Got 6
A.doSomethingWith()   /* breaks with
                         Caught: groovy.lang.MissingPropertyException: 
                         No such property: value for class: A */

ここで、http: //groovy.codehaus.org/Closures+-+Formal+Definitionで groovy クロージャーの定義を調べました。

私が理解しているように、ゲッターが呼び出されると、「コンパイラーは「値」が利用可能であることを静的に判断できない」ため、失敗が発生します

では、このシナリオに関する提案はありますか? 乾杯

4

2 に答える 2

2

返された Closure のデリゲートを変更することもできます。

value = 5

Closure clos = A.doSomethingWith

// Set the closure delegate
clos.delegate = [ value: value ]

clos(6)  // Got 6
clos()   // Got 5
于 2012-11-14T14:40:04.907 に答える
1

スクリプトバインディングで未解決のプロパティをチェックすることで、あなたが望むことをすることができました:

class A {
  static Closure getDoSomethingWith() { { i = value -> println "Got $i" } } 
}
A.metaClass.static.propertyMissing = { String prop -> binding[prop] }

value = 5


A.doSomethingWith 6  // Got 6
A.doSomethingWith() // prints "Got 5"
于 2012-11-14T14:31:11.777 に答える