1. 序章

このチュートリアルでは、さまざまなGroovyスコープを操作する方法と、その可変スコープを活用する方法について説明します。

2. 依存関係

全体を通して、groovy-allspock-coreの依存関係を使用します

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.13'
    testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
}

3. すべてのスコープ

Groovyのスコープは、とりわけ、すべての変数がデフォルトでパブリックに作成されるという規則に従います。 これは、指定されていない限り、コード内の他のスコープから作成した変数にアクセスできることを意味します。

これらのスコープの意味を確認し、これをテストするためにGroovyスクリプトを実行します。 スクリプトを実行するには、以下を実行するだけです。

groovy <scriptname>.groovy

3.1. グローバル変数

Groovyスクリプトでグローバル変数を作成する最も簡単な方法は、特別なキーワードを使用せずに、スクリプト内の任意の場所にグローバル変数を割り当てることです。 タイプを定義する必要さえありません:

x = 200

次に、次のGroovyスクリプトを実行すると、次のようになります。

x = 200
logger = Logger.getLogger("Scopes.groovy")
logger.info("- Global variable")
logger.info(x.toString())

グローバルスコープから変数に到達できることがわかります。

3.2. 関数スコープからのグローバル変数へのアクセス

グローバル変数にアクセスする別の方法は、関数スコープを使用することです。

def getGlobalResult() { 
   return 1 + x
}

この関数は、スコープスクリプト内で定義されます。 グローバルx変数に1を追加します。

次のスクリプトを実行すると、次のようになります。

x = 200
logger = Logger.getLogger("Scopes.groovy")

def getGlobalResult() {
    logger.info(x.toString())
    return 1 + x
}

logger.info("- Access global variable from inside function")
logger.info(getGlobalResult().toString())

結果として201を取得します。 これは、関数のローカルスコープからグローバル変数にアクセスできることを証明しています。

3.3. 関数スコープからのグローバル変数の作成

関数スコープ内からグローバル変数を作成することもできます。 このローカルスコープでは、変数の作成にキーワードを使用しない場合は、グローバルスコープで作成します。 次に、新しい関数でグローバル変数zを作成しましょう。

def defineGlobalVariable() {
    z = 234
}

次のスクリプトを実行してアクセスしてみてください。

logger = Logger.getLogger("Scopes.groovy")
 
def defineGlobalVariable() {
    z = 234
    logger = Logger.getLogger("Scopes.groovy")
    logger.info(z.toString())
}

logger.info("- function called to create variable")
defineGlobalVariable()
logger.info("- Variable created inside a function")
logger.info(z.toString())

グローバルスコープからzにアクセスできることがわかります。 したがって、これは最終的に、変数がグローバルスコープで作成されたことを証明します。

3.4. 非グローバル変数

非グローバル変数の場合、ローカルスコープ用にのみ作成された変数を簡単に見ていきます。

具体的には、キーワードdefを見ていきます。 このように、この変数を、スレッドが実行されているスコープのの一部として定義します。

それでは、グローバル変数yと関数ローカル変数を定義してみましょう。

logger = Logger.getLogger("ScopesFail.groovy")

y = 2

def fLocal() {
    def q = 333
    println(q)
    q
}

fLocal()

logger.info("- Local variable doesn't exist outside")
logger.info(q.toString())

このスクリプトを実行すると、失敗します。 失敗する理由は、 q がローカル変数であり、関数fLocalのスコープに属しているためです。 defキーワードを使用してqを作成するため、グローバルスコープを介してにアクセスすることはできません。

明らかに、fLocal関数を使用してqにアクセスできます。

logger = Logger.getLogger("ScopesFail.groovy")

y = 2

def fLocal() {
    def q = 333
    println(q)
    q
}

fLocal()

logger.info("- Value of the created variable")
logger.info(fLocal())

これで、 q 変数を1つ作成したにもかかわらず、その変数は他のスコープでは使用できなくなったことがわかります。 fLocal を再度呼び出すと、新しい変数を作成するだけです。

4. 結論

この記事では、Groovyスコープがどのように作成され、コード内のさまざまな領域からどのようにアクセスできるかを見てきました。

いつものように、例の完全なソースコードは、GitHubから入手できます。