为什么groovy没有在其范围内找到我的变量

时间:2017-05-11 02:08:58

标签: groovy scope static

我收到此错误:

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());
        }
}

1 个答案:

答案 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(以及许多其他版本)都是词法范围的。使用词法作用域定义代码的上下文决定了作用域中的内容,而不是执行时的运行时上下文。找出与动态范围绑定的内容需要知道调用树。