You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (JIRA)" <ji...@apache.org> on 2018/10/07 06:00:00 UTC
[jira] [Comment Edited] (GROOVY-8826) Captured loop variables have
surprising and Java-incompatible behavior
[ https://issues.apache.org/jira/browse/GROOVY-8826?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16640975#comment-16640975 ]
Daniel Sun edited comment on GROOVY-8826 at 10/7/18 5:59 AM:
-------------------------------------------------------------
Here is a workaround, but we should fix the issue at last...
{code:java}
import java.util.ArrayList;
import java.util.Arrays;
public class Test {
public static void main(String... args) {
ArrayList<Runnable> closures = new ArrayList<>();
for (int i: new int[] {1, 2}) {
int tmp = i
closures.add(() -> System.out.println(tmp));
}
for (Runnable closure: closures)
closure.run();
}
}
{code}
was (Author: daniel_sun):
Here is a workaround, but we should fix the issue at last...
{code:java}
import java.util.ArrayList;
import java.util.Arrays;
public class Test {
public static void main(String... args) {
ArrayList<Runnable> closures = new ArrayList<>();
for (int i: [1, 2]) {
int tmp = i
closures.add(() -> System.out.println(tmp));
}
for (Runnable closure: closures)
closure.run();
}
}
{code}
> Captured loop variables have surprising and Java-incompatible behavior
> ----------------------------------------------------------------------
>
> Key: GROOVY-8826
> URL: https://issues.apache.org/jira/browse/GROOVY-8826
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 3.0.0-alpha-3
> Reporter: Роман Донченко
> Priority: Major
>
> Consider this source:
> {code:java}
> import java.util.ArrayList;
> import java.util.Arrays;
> public class Test {
> public static void main(String... args) {
> ArrayList<Runnable> closures = new ArrayList<>();
> for (int i: new int[] {1, 2})
> closures.add(() -> System.out.println(i));
> for (Runnable closure: closures)
> closure.run();
> }
> }
> {code}
> If it's compiled as Java, the output is:
> {code}
> 1
> 2
> {code}
> But if it's compiled as Groovy, the output is:
> {code}
> 2
> 2
> {code}
> In other words, in Java each iteration gets a unique instance of the {{i}} variable, which is captured in the corresponding closure, while in Groovy, only one {{i}} variable exists and is captured into both closures. IMO, the Groovy behavior is significantly less useful, and it would be nice if in 3.0 it was changed to match Java.
> Groovy also exhibits the same behavior with Groovy closures and {{for(...in...)}} loops. I just used Java-compatible syntax for this example in order to contrast Groovy and Java.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)