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