groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Henrik Martin <hen...@netgate.net>
Subject Re: What am I missing with this Elvis operator expression?
Date Mon, 11 Apr 2016 23:27:09 GMT
Sure, it makes sense. I guess my confusion originated in other uses with 
Strings. Like this:

foo = 'hello'
foo = foo ?: 'goodbye' // foo == 'hello'

where foo ends up being set to 'hello'. I guess a String as the left 
hand side expression of the Elvis operator evaluates to itself instead 
of boolean true. While it seems to be true that if it's null, it's the 
same as false? Like this:

foo = null
foo = foo ?: 'goodbye'  // foo == 'goodbye'

So a null reference is equivalent to boolean false. I guess that makes 
sense. The cases that surprise me the most are these:

foo = '' // empty string
foo = foo ?: 'goodbye' // foo == 'goodbye'

and

foo = ' ' // single space
foo = foo ?: 'goodbye' // foo = ' '

I guess I should RTFM a little more thoroughly :-)

-H

On 4/12/16 12:54 AM, Tankerbay wrote:
> Well, you seem to know what's happening.
> sleepFor = sleepFor > 0 ?: 10
> is equivalent to:
> sleepFor = (sleepFor > 0 ) ?: 10
>
> So the entire expression (sleepFor > 0) is evaluated and, if found to 
> be true, returned as the result of the elvis expression.
>
> Elvis operator like this:
> Z = X ?: Default
> is equivalent to:
> Z = X ? X : Default
> not
> Z = X ? (some part of X) : Default
>
>
> On Mon, Apr 11, 2016 at 3:43 PM, Henrik Martin <henrik@netgate.net 
> <mailto:henrik@netgate.net>> wrote:
>
>     And of course I meant to say "... and my println statement prints
>     10", not 910. :-)
>
>     -H
>
>
>     On 4/12/16 12:41 AM, Henrik Martin wrote:
>
>         Greetings. I ran into this little surprise with the Elvis
>         operator today. I guess it must boil down to my
>         misunderstanding of how the operator work. I have a method
>         that tries to calculate a value based on an input. If the
>         input value is set to -1, I'd like to change it to a positive
>         value (which is calculated, but in the test I just hard coded
>         it to 10). In the process of doing so, I ran into a surprise.
>         Here's a Spock test case that illustrates it:
>
>         import spock.lang.Specification
>
>         class ElvisTest extends Specification {
>           def "test"() {
>             setup:
>             def sleepFor = -1
>             sleepFor = sleepFor > 0 ?: 10
>             println sleepFor
>             sleepFor = 972
>             sleepFor = sleepFor > 0 ?: 10
>             println sleepFor
>           }
>         }
>         When sleepFor is initialized to -1, the operator works as I
>         expected it and my println statement prints 910. If I
>         initialize sleepFor to some other value like the one in the
>         test, all of a sudden the result of the Elvis operator is true
>         instead of an integer. I naïvely thought that ?: would yield
>         the numeric value of the sleepFor variable in the left hand
>         expression instead of the boolean result of it (as in sleepFor
>         > 0). What am I missing? In this case, I could always use the
>         Java style of:
>
>         sleepFor = sleepFor > 0 ? sleepFor : 10
>
>         but the whole point of the Elvis operator is brevity, and this
>         behavior was a small surprise to me. Thanks,
>
>         -H
>
>
>


Mime
View raw message