
When you attempt to write several predictable comparisons in one statement, it gets ugly fast. Here are some methods for cleaning it up.
You know the typical if/else statement in Ruby, right?
if this_thing == 'cheese'
puts 'This is cheese.'
else
puts 'This is not cheese.'
endNow, let's say you want to see if this_thing is "cheese" or "magical beans." Logic tells you to write something like this:
if this_thing == 'cheese' || this_thing == 'magical beans'
puts 'This is either cheese or magical beans.'
else
puts 'This is not cheese or magical beans.'
endOh, but now you need to see if you also have a meat grinder.
if this_thing == 'cheese' || this_thing == 'magical beans' || this_thing == 'meat grinder'
puts 'This is either cheese or magical beans or a meat grinder.'
else
puts 'This is not cheese or magical beans or a meat grinder.'
endIt gets out of hand real fast.
One solution is to write regex comparisons to the original variable, or something like this:
if this_thing =~ /^(cheese|magical\ beans|meat\ grinder)$/
puts 'This is either cheese or magical beans or a meat grinder.'
else
puts 'This is not cheese or magical beans or a meat grinder.'
endThat should work fine, but I don't love it when you're comparing something straightforward, like and integer or a predictable string. It works better when you're looking for part of a string or some variation in the string.
Instead, why not just turn the expected values into an array and then see if this_thing is in there?
if ['cheese', 'magical beans', 'meat grinder'].include?(this_thing)
puts 'This is either cheese or magical beans or a meat grinder.'
else
puts 'This is not cheese or magical beans or a meat grinder.'
endAnd if your array gets out of hand, you can always define it elsewhere.
weird_kitchen_things = [
'cheese',
'magical beans',
'meat grinder',
'draino'
]
if weird_kitchen_things.include?(this_thing)
puts "This is either #{weird_kitchen_things.join(' or ')}."
else
puts "This is not #{weird_kitchen_things.join(' or ')}."
endNotice here how we also clean up the output so we don't have to change the return every time we add a value to our array.