2017-05-11 74 views
1

我得到這個錯誤:爲什麼常規沒有找到我的變量在其範圍內

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

有兩個局部變量叫做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(其他很多)都是詞彙範圍的。使用詞法範圍界定代碼的上下文決定了範圍內的內容,而不是執行時的運行時上下文。找出與動態範圍界定有什麼聯繫需要知道調用樹。

相關問題