groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Sun (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (GROOVY-8826) Captured loop variables have surprising and Java-incompatible behavior
Date Sun, 07 Oct 2018 06:09:00 GMT

    [ https://issues.apache.org/jira/browse/GROOVY-8826?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16640976#comment-16640976
] 

Daniel Sun commented on GROOVY-8826:
------------------------------------

To clarify my opinion, we should fix the issue only when using lambda expression, which should
behave same with Java

> 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)

Mime
View raw message