Hi, all Thank you for involving in this discussion. I get it too. x is s StringWriter and that make sense. I came up with this script when I'm learning Groovy and I replicate this kind of logic to the other scripting languages like JavaScript and so on. I want to figure out the internal handling mechanism of closure in string parameters, so I build this confusing script.
Thanks again, Guillaume, Keith and Anthony > On 22 Jan 2017, at 03:47, Suderman Keith <[email protected]> wrote: > > Oops, there is a last minute cut/paste error in my example script. It should > read: > > a = { x -> > println x.class > println x > x.write('foo') > return 'bar' > } > assert "no argument ${a}" == "no argument foo" > > and it will print: > > class java.io.StringWriter > no argument > > Keith > >> On Jan 21, 2017, at 2:37 PM, Suderman Keith <[email protected] >> <mailto:[email protected]>> wrote: >> >> This took me awhile to wrap my head around this as well. Keep in mind what >> Guillaume said, the object passed to the closure is a writer. This example >> should hopefully make it clearer what is going on: >> >> a = { >> println x.class >> x -> println x >> x.write('foo') >> return 'bar' >> } >> assert "no argument ${a}" == "no argument foo" >> >> This will print "class java.io.StringWriter" to System.out >> >> Since the parameter passed to the closure is a StringWriter 'println x' will >> cause Groovy to call toString() on the writer, which already contains the >> string "no argument ". The string 'foo' is then appended to the writer so >> the GString finally resolves to "no argument foo". Notice the return value >> from the closure is ignored. >> >> Hope this helps, >> Keith >> >> >> >>> On Jan 21, 2017, at 12:54 PM, Anthony Hepple <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> Hi Yang >>> >>> I too am confused. The following code better describes my confusion: >>> >>> a = {x -> println x} >>> assert "no argument ${a}" == "no argument " >>> >>> So far so good, but why does this have the side effect of printing "no >>> argument" to standard out? As you say, the closure, a, appears to >>> magically capture the string "no argument". >>> >>> Perhaps if someone could explain this they would help us both? >>> >>> Thanks >>> Anthony >>> >>> On 21 January 2017 at 16:19, Guillaume Laforge <[email protected] >>> <mailto:[email protected]>> wrote: >>>> x doesn't capture the value "a". >>>> Your GString contains a "a", and when you call a() you pass the string "a" >>>> to it. >>>> So the a() call return "a", and you print "a", so you see the output as >>>> well >>>> as the println of "a", thus two "a"'s. >>>> >>>> Not sure how you came with that code. It's pretty confusing. >>>> Normally, if you use a one-arg closure inside a GString, the parameter of >>>> the closure is actually a writer against which you can write. You're not >>>> supposed to print from there or have side effects. >>>> >>>> What are you trying to achieve here? >>>> >>>> Guillaume >>>> >>>> On Sat, Jan 21, 2017 at 4:46 AM, Yang Yang <[email protected] >>>> <mailto:[email protected]>> wrote: >>>>> >>>>> Sorry, after reading that part of documentation I still feel a bit >>>>> confused. >>>>> >>>>> groovy:000> "a${x->println x}" >>>>> a >>>>> a >>>>> ===> a >>>>> groovy:000> a = {x->println x} >>>>> ===> groovysh_evaluate$_run_closure1@737a135b >>>>> groovy:000> a("a${x->println x}") >>>>> a >>>>> a >>>>> ===> null >>>>> >>>>> Say "a${a}" will be expanded as "a${x->println x}" and I don't understand >>>>> why x captured the value "a" ? >>>>> >>>>> "a${x->println x}" will output "a" because ${x->println x} will be lazy >>>>> evaluated. Then the result "a" is magically captured by the closure >>>>> {x->println x} and it print another "a". But if it like so then the first >>>>> return ===> should be null. >>>>> >>>>> >>>>> >>>>> On 20 Jan 2017, at 16:49, Guillaume Laforge <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>>> Hi Yang, >>>>> >>>>> Interpolated values in a GString that are closures are executed. >>>>> Have a look at the documentation which shows some examples of this: >>>>> >>>>> http://groovy-lang.org/syntax.html#_special_case_of_interpolating_closure_expressions >>>>> >>>>> <http://groovy-lang.org/syntax.html#_special_case_of_interpolating_closure_expressions> >>>>> >>>>> Guillaume >>>>> >>>>> >>>>> On Fri, Jan 20, 2017 at 8:22 AM, Yang Yang <[email protected]> wrote: >>>>>> >>>>>> Script: >>>>>> a = {x -> println x} >>>>>> a("a${a}") >>>>>> >>>>>> Output: >>>>>> a >>>>>> a >>>>>> >>>>>> Why? >>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Guillaume Laforge >>>>> Apache Groovy committer & PMC Vice-President >>>>> Developer Advocate @ Google Cloud Platform >>>>> >>>>> Blog: http://glaforge.appspot.com/ >>>>> Social: @glaforge / Google+ >>>>> >>>>> >>>> >>>> >>>> >>>> -- >>>> Guillaume Laforge >>>> Apache Groovy committer & PMC Vice-President >>>> Developer Advocate @ Google Cloud Platform >>>> >>>> Blog: http://glaforge.appspot.com/ <http://glaforge.appspot.com/> >>>> Social: @glaforge / Google+ >>> >>> >>> >>> -- >>> Anthony Hepple >>> 01704 227828 / 07931 504049 >>> http://www.dhdevelopment.co.uk <http://www.dhdevelopment.co.uk/> >
