Ben beklendiği gibi aşağıdaki iki komut işe sen evals arasındaki mevcut değil bildirilen sınıflarda hakkında ne anlama konusunda emin değilim:
class C {{println 'hi'}}
new C()
...
new C()
Ancak, yöntemler bunları bildiren sınıfa bağlanır ve GroovyShell her örnek için yeni bir sınıf oluşturur. Eğer betiklerin herhangi birinin geri dönüş değerine ihtiyaç duymuyorsanız ve bunlar gerçekten betikler (ana yöntemlerle sınıflar değil) ise, değerlendirilen her scriptin sonuna aşağıdakileri ekleyebilirsiniz. Eğer değerlendirmeyi el yönetmek ve ayrıştırma bir parçası olarak komut çalıştırabilirsiniz dönüş değeri dayanıyorsa
Class klass = this.getClass()
this.getMetaClass().getMethods().each {
if (it.declaringClass.cachedClass == klass) {
binding[it.name] = this.&"$it.name"
}
}
(uyarı, denenmemiş kodu yalnızca açıklayıcı kullanımlar için aşağıdaki) ...
String scriptText = ...
Script script = shell.parse(scriptText)
def returnValue = script.run()
Class klass = script.getClass()
script.getMetaClass().getMethods().each {
if (it.declaringClass.cachedClass == klass) {
shell.context[it.name] = this.&"$it.name"
}
}
// do whatever with returnValue...
Son bir ihtar aldığına eminim. Statik olarak yazılan değişkenler, bağlanmada saklanmadıkları için değerlendirmeler arasında tutulmaz. Bu yüzden önceki betikte 'klass' değişkeni senaryolar arasında saklanmayacak ve kaybolacak. Bunu düzeltmek için, tüm değişkenlerin ilk kullanımındaki tip bildirimlerini kaldırmanız, yani okunacak ve ciltlenmeye yazılacaklardır.
şuna bakıyorum: "f" nasıl bir değişken olarak bağlanma içine girer? görmüyorum – djangofan