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