You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@groovy.apache.org by mg <mg...@arscreat.com> on 2018/09/04 16:11:28 UTC
Re: @CompileStatic void method returns null ?
Great - does any Groovy dev lean towards being -1 on this ?-)
-------- Ursprüngliche Nachricht --------Von: Paul King <pa...@asert.com.au> Datum: 04.09.18 02:21 (GMT+01:00) An: MG <mg...@arscreat.com> Betreff: Re: @CompileStatic void method returns null ?
Yes, I'd be +1 for the static type checker to complain here. The current behavior was to ease converting existing code over to use @TC/@CS but this is one of those cases where I think you want the extra checking that @TC/@CS can provide.
On Tue, Sep 4, 2018 at 10:09 AM MG <mg...@arscreat.com> wrote:
But the call to Foo#baz() coud return an e.g. GroovyVoidObject
instance, which in turn throws a "cannot return void from method" if
that happens to be the last expression in your example, no ?
It feels like returning null here is just a stopgap, not anything
one actually wants to have in the language...
I don't expect the dynamic compiler to be changed, but should we
really mirror the dynamic comiler behavior in the static compiler in
this case ? I think it would be much more least surprise in the
@CompileStatic case...
Cheers,
mg
PS: Calling void methods better be fine, otherwise why do they exist
in the first place ;-) - I am/was always referring to my initial
question, so the whole thread is about expecting/using void method
call results somewhere...
On 04.09.2018 01:41, Paul King wrote:
Calling void methods is fine. Expecting a result is the
point in question.
For dynamic Groovy, you can't always tell which case you have:
class Foo {
def bar() { 42 }
void baz() { }
}
def method(boolean condition, delegate, meth1, meth2) {
if (condition) delegate."$meth1"()
else delegate."$meth2"()
}
println method(true, new Foo(), 'bar', 'baz') // 42
println method(false, new Foo(), 'bar', 'baz') // null
Here, "method" is expecting to return some value that
happens to be the last expression, i.e. the result of the
if/then/else expression, so we return null in such cases.
Cheers, Paul.
On Tue, Sep 4, 2018 at 7:38 AM MG <mg...@arscreat.com>
wrote:
What I meant
was: What sense does letting void methods be called make
for the dynamic case, i.e. the dynamic compiler ? From a
programmer's
perspective, i.e. what is a programming use case for that
feature/behavior, in dynamic Groovy ?
Of course I can do the following in dynamic Groovy:
// Groovy 2.5.0
class Goo {
//void nogoo() { return 123 } // Dynamic Groovy compiler:
RuntimeParserException: Cannot use return statement with an
expression on a method that returns void
void nogoo() { 123 }
}
final goo = new Goo()
println "original: goo.nogoo()=${goo.nogoo()}"
goo.metaClass.nogoo = { return 456 }
println "mopped: goo.nogoo()=${goo.nogoo()}"
Which will build, run, and output
original: goo.nogoo()=null
mopped: goo.nogoo()=456
i.e. returning 456 from a void method in the second case.
But if I am using a library that includes the Goo class, why
would I
ever expect a return value from the nogoo method (and
therefore call
it), considering its return type is void ? And if I control
the Goo
class myself, why would I not just change its return type to
int or def ?
Cheers,
mg
On 03.09.2018 22:36, Jochen Theodorou wrote:
> On 03.09.2018 17:13, mg wrote:
>> But in what scenario does the dynamic behavior make
sense ?
>
> for a static compiler? none other than being compatible
>
> bye Jochen
>