我收到此错误:
Apparent variable 'b' was found in a static scope but doesn't refer to a local variable, static field or class. Possible causes:
You attempted to reference a variable in the binding or an instance variable from a static context.
You misspelled a classname or statically imported field. Please check the spelling.
You attempted to use a method 'b' but left out brackets in a place not allowed by the grammar.
@ line 11, column 12.
int a = (b + 5);
^
为什么不将b识别为变量?我正在尝试测试Groovy中的作用域如何工作。它是静态的还是动态的?
class practice{
static void main(String[] args)
{ int b=5;
foo(); // returns 10
bar(); // returns 10
println('Hello World');
}
//public int b = 5;
static void foo()
{
int a = (b + 5);
println(a);
}
static void bar()
{
int b = 2;
println(foo());
}
}
答案 0 :(得分:1)
有两个局部变量叫做b,一个在main中,一个在bar中。 foo方法无法看到它们中的任何一个。如果groovy使用了动态范围,那么它会在bar中看到b的值并在foo中使用它,没有发生这种情况表明范围是静态的。
看起来发布的代码来自here。以下是我将其翻译为Groovy的方法:
public class ScopeExample {
int b = 5
int foo() {
int a = b + 5
a
}
int bar() {
int b = 2
foo()
}
static void main(String ... args) {
def x = new ScopeExample()
println x.foo()
println x.bar()
}
}
运行主打印
10
10
显示调用前的局部变量不会改变结果。
groovy中的范围是词汇(意味着静态),而非动态。 Groovy,Java,Scheme,Python和JavaScript(以及许多其他版本)都是词法范围的。使用词法作用域定义代码的上下文决定了作用域中的内容,而不是执行时的运行时上下文。找出与动态范围绑定的内容需要知道调用树。