module Enumerable
def all_true
self.inject(true) { |r, v| r && (yield v) }
end
end
We start by monkey patching the
Enumerable
module which will make it available for Array
s, Hash
es, etc., basically anything that includes Enumerable
. Next, we define the method all_true
. The only line in the method is an inject
which we initialize with true
and then give it a block with two parameters, the r(esult) and the v(alue). We then and/&&
the r(esult) with whatever the yield of the v(alue) returns.You can test it with the following code ...
puts "#{[2, 4, 6, 8].all_true { |n| n%2 == 0 }}"
puts "#{[2, 4, 7, 8].all_true { |n| n%2 == 0 }}"
puts "#{{ 2=>2, 4=>4, 6=>6, 8=>8}.all_true { |n| n[0]%2 == 0 && n[1]%2 == 0 }}"
puts "#{{ 2=>2, 4=>4, 7=>7, 8=>8}.all_true { |n| n[0]%2 == 0 && n[1]%2 == 0 }}"
The first two of each set will return true, the second false.
As I've been doing the Programming Praxis problems, I've found myself using
inject
and its close relative map/collect
more and more. I think this is partly because of the types of problems posted there and the influence of the solutions that are generated which tend to be functional programming based. At any rate, having a good understanding of both inject
and map/collect
will serve you well and simplify many of your day to day programming tasks.Let me know if you have questions or comments.