You can do more complicated things: do #select with a block and check the length of the result but that seems more obtuse to me.
I don't think that'll work the way you expect. true && false will resolve to false and you'll just be checking for false.
mememeIAMME: && has higher precedence and so your conditional won't work the way that you think it will. It's evaluating str[i] && i.odd? before it then calls include?. You need to put parentheses around str[i].
qolq: Like baweaver said, it's a little hard to know how best to structure this without more context but there are situations in which three values might be returned. The <=> method is typically implemented to return -1, 0, 1. My suggestion would be to return something in this format. Perhaps something like :constrained, :unconstrained, :unchanged.
samort7: I was looking for information about Enumerators the other day and found this article (https://medium.com/@farsi_mehdi/the-enumerable-module-in-ruby-part-i-745d561cfebf) and its sequel helpful.