Evaluate many boolean expressions like Array#join in Ruby

istrasci picture istrasci · Jan 14, 2013 · Viewed 7.9k times · Source

In Ruby, you can use Array#join to simple join together multiple strings with an optional delimiter.

[ "a", "b", "c" ].join        #=> "abc"
[ "a", "b", "c" ].join("-")   #=> "a-b-c"

I'm wondering if there is nice syntactic sugar to do something similar with a bunch of boolean expressions. For example, I need to && a bunch of expressions together. However, which expressions will be used is determined by user input. So instead of doing a bunch of

cumulative_value &&= expression[:a] if user[:input][:a]

I want to collect all the expressions first based on the input, then && them all together in one fell swoop. Something like:

be1 = x > y
be2 = Proc.new {|string, regex| string =~ regex}
be3 = z < 5 && my_object.is_valid?
[be1,be2.call("abc",/*bc/),be3].eval_join(&&)

Is there any such device in Ruby by default? I just want some syntatic sugar to make the code cleaner if possible.

Answer

Try Array#all?. If arr is an Array of booleans, this works by itself:

arr.all?

will return true if every element in arr is true, or false otherwise.

You can use Array#any? in the same manner for joining the array on ||, that is, it returns true if any element in the array is true and false otherwise.

This will also work if arr is an array of Procs, as long as you make sure to pass the correct variables to Proc#call in the block (or use class, instance, or global variables).