16

Groovyでは、returnステートメントはオプションであり、次のようなメソッドを記述できます。

def add(a, b) {
    a + b
}

...これは結果を追加abて呼び出し元に返します。

ただし、メソッドに複数の戻り「ステートメント」がある場合のセマンティクスは何であるか疑問に思います。たとえば、Javaでは次のようになります。

String append(String a, String b) {
    if (a == null) {
        return b;
    }
    return a + b;
}

これは(仮想的に)次のようにGroovyに変換できます。

def append(a, b) {
    if (! a) {
        b
    }
    a + b
}

ただし、この場合、Groovyは、ステートメントbの内部が返される必要があることをどのように認識しますか?ifそれともそうではありませんか?Groovyは、結果が未使用のステートメントを単純に扱うことはできないと思いますがreturn、正しいですか?この場合、「オプションのリターン」機能がどのように動作するかについて明確に定義されたセマンティクスはありますか?

4

1 に答える 1

29

リンクしたページ(かなり簡潔に)は、正確なセマンティクスを説明しています。

メソッドの最後にあるreturnステートメントはオプションであることに注意してください。

したがって、明示的に返さない限りb、そのifブロック内は返されません。実際には、これは、戻り値が最後に評価されたステートメントの結果になることを意味します。

def append(a, b) {
   if (!a) { b }
   else { a + b }
}

その場合、結果はbifの場合とそうでない場合!aになります。truea + b

void関数の呼び出しの結果はですnull。したがって、例が

def append(a,b) {
   if (!a) { b }
   else { a + b }
   println "debug: $a $b"
}

その後append、常に戻りnullます。

私自身の経験則では、メソッドまたはクロージャに複数のステートメントが含まれている場合は、常に明示的なreturnステートメントを使用します。より複雑なメソッドで暗黙のreturnステートメントに依存することは危険だと思います。メソッドの最後に行を追加すると、意図していなくても戻り値が変更されるためです。

于 2012-10-17T01:55:42.120 に答える