[
https://issues.apache.org/jira/browse/GROOVY-11792?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18034734#comment-18034734
]
Eric Milles edited comment on GROOVY-11792 at 11/1/25 12:29 PM:
----------------------------------------------------------------
A closure-shared variable -- "n" in this case -- is a Reference. So when your
suppliers are executed the value behind the reference is 3. The local capture
variable is new for each loop, so the value is not changed for each supplier
that uses it. I doubt this is a trivial thing to change and is likely breaking
for someone.
was (Author: emilles):
A closure-shared variable -- "n" in this case -- is a Reference. So when your
suppliers are executed the value of the reference is 3. The local capture
variable is new for each loop, so the value is not changed for each supplier
that uses it. I doubt this is a trivial thing to change and is likely breaking
for someone.
> Incorrect captured variable in closure
> --------------------------------------
>
> Key: GROOVY-11792
> URL: https://issues.apache.org/jira/browse/GROOVY-11792
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.5.23, 3.0.25, 4.0.29, 5.0.2
> Reporter: Daniel Sun
> Priority: Major
>
> Expect 14(1+4+9), but get 27(9+9+9)
> {code:java}
> import java.util.function.Supplier
> def numbers = [1, 2, 3]
> List suppliers = []
> for (n in numbers) {
> println "v: ${n}"
> Supplier s = {
> def r = n * n
> println "$n: $r"
> return r
> }
> suppliers << s
> }
> println "Result: ${suppliers.sum({e -> e.get()})}"
> {code}
> yields:
> {code:java}
> v: 1
> v: 2
> v: 3
> 3: 9
> 3: 9
> 3: 9
> Result: 27
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)