[ https://issues.apache.org/jira/browse/GROOVY-8952?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16737024#comment-16737024 ]
Paul King commented on GROOVY-8952: ----------------------------------- The code has always (well, at least since 2007) handled closures specially to allow lazy processing in those rare cases when it does make sense: https://github.com/apache/groovy/blob/master/src/main/groovy/groovy/lang/GString.java#L184 I am unsure whether the above is your real use case or a cut down version. If we understood what you were really trying to do, perhaps we could suggest some alternatives for you. > Eager interpolation evaluating as a Closure does a lazy invoke of the Closure > ----------------------------------------------------------------------------- > > Key: GROOVY-8952 > URL: https://issues.apache.org/jira/browse/GROOVY-8952 > Project: Groovy > Issue Type: Bug > Affects Versions: 2.5.5 > Environment: Windows 10 > Reporter: Chaitanya Birudavolu > Priority: Major > Labels: closure, eager, interpolation > > This is regarding the eager interpolation placeholder > {code:java} > ${ <expression> }{code} > The expected behavior is that the expression would be evaluated eagerly (at > GString creation time). Later, at GString coercion time, the value that is > expected in the place of the eager placeholder is the result of > {code:java} > <expression>.toString(){code} > > > This works most of the time, but doesn't seem to work if the expression > evaluates to a Closure type. If the expression evaluates to a Closure type, > what is observed is that, in the place of the placeholder, instead of seeing > ... > {code:java} > <closure>.toString(){code} > ... we see... > {code:java} > <closure-invocation-result>.toString(){code} > For example, in the below code... > > {code:java} > def c = {->println ('Inside closure')} > println ('Just before creating the GString') > def gstr = "${println ('Inside eager placeholder'); 20; 30; c}" > println ('Just after creating the GString') > println (gstr) > {code} > > ...the expected behavior is that the closure should never get executed, and > the last println should only print the result of > {code:java} > c.toString(){code} > Instead, the last line printed is observed to be: > {code:java} > Inside closure{code} > -- This message was sent by Atlassian JIRA (v7.6.3#76005)