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 <hen...@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 >> >> >