When you have methods or statements outside of a class declaration in a groovy script, an implicit class is created. To answer your questions:
-
In your example,
func()can access the fieldcbecause they are both members of the implicit class. TheMainclass is not, so it can’t. -
You need to pass a reference to the script variable to
method(). One way is to pass the implicitly definedbindingobject, through which you can access all the script scope variables.
Example:
#!/usr/bin/groovy
import groovy.transform.Field;
//println org.codehaus.groovy.runtime.InvokerHelper.getVersion()
def a = 42;
b = "Tea"
@Field def c = "Cheese"
void func()
{
// println a // MissingPropertyException
println b // prints "Tea"
println c // prints "Cheese" with groovy 2.1.2, MissingPropertyException with groovy 1.8.6
}
class Main
{
def scriptObject
def binding
def method()
{
// println a // MissingPropertyException
println binding.b
println scriptObject.c
}
}
func();
new Main(scriptObject: this, binding: binding).method();