Most programming languages have a Data Type called “Boolean”. This is
a form of data with only two possible values (usually “true” and
“false”). The Ruby language however does not have a Boolean Data
Type.
Ruby has Boolean Methods, otherwise called Predicates or Query. These are methods that end with a question mark (?) . It will be worth noting that only "false" and "nil" values evaluate to false in Ruby.
Let's take the example of the all? Boolean method;
%w[ant bear cat].all? { |word| word.length >= 3 } #=> true
%w[ant bear cat].all? { |word| word.length >= 4 } #=> false
%w[ant bear cat].all?(/t/) #=> false
[1, 2i, 3.14].all?(Numeric) #=> true
[nil, true, 99].all? #=> false
[].all? #=> true
The all? method passes each element of the collection to the given block. The method returns true if the block never returns false or nil. If the block is not given, Ruby adds an implicit block of { |obj| obj } which will cause all? to return true when none of the collection members are false or nil.
If instead a pattern is supplied, the method returns whether pattern === element for every collection member.
It is a similar case with the any? method
%w[ant bear cat].any? { |word| word.length >= 3 } #=> true
%w[ant bear cat].any? { |word| word.length >= 4 } #=> true
%w[ant bear cat].any?(/d/) #=> false
[nil, true, 99].any?(Integer) #=> true
[nil, true, 99].any? #=> true
[].any? #=> false
From the above examples, we can conclude that the question mark (?) at the end of the method is set when we have a method that returns Boolean values — ‘true’ or ‘false’.
Creating Boolean Methods
Apart from the Boolean methods provided by Ruby, you can as well create your own Boolean Methods.
For example;
def is_even?(x)
(x % 2) == 0
end
def is_odd?(x)
(x % 2) == 1
end
def multiples_of_five?(x)
(x % 5) == 0
end
def less_than_three?(x)
x < 3
end
puts is_even?(2)
puts is_even?(3)
puts is_odd?(2)
puts is_odd?(3)
puts multiples_of_five?(3)
puts multiples_of_five?(5)
puts less_than_three?(2)
puts less_than_three?(4)
This will result in the following
true
false
false
true
false
true
true
false
To conclude, we have learnt that;