Let's say I have a hash with some values in it, and I want to
print out that hash in some sort order. I can:
korder = vals.keys.sort { |ka, kb|
vals[kb] <=> vals[ka]
}
korder.each { |key| printf " %3d - %s\n", vals[key], key }
That's pretty easy, but what if I want to cascade comparisons
in that sort, such that if the data-values are equal, then I want
the sort order to be based on some other comparison? It
seems to me that I have to:
korder = vals.keys.sort { |ka, kb|
sres = vals[kb] <=> vals[ka]
sres = ka <=> kb if sres == 0
sres
}
korder.each { |key| printf " %3d - %s\n", vals[key], key }
In perl, I can just casade the '<=>' comparisons, because it
will treat the zero value as "false". Thus, I could get away
with a one-liner somewhat similar to:
vals[kb] <=> vals[ka] or a <=> kb
but that doesn't work in ruby. Is there some other way I could
collapse multiple <=> comparisons into a single statement?
I do not mind the multi-statement form (now that I've convinced
myself that I can't cascade them the way I could in perl), but I'm
just wondering if there's a better way to do it.
···
--
Garance Alistair Drosehn = drosihn@gmail.com
Senior Systems Programmer or gad@FreeBSD.org
Rensselaer Polytechnic Institute; Troy, NY; USA