This blog is part of our Ruby 2.5 series.
Ruby 2.5.0 was recently released.
Ruby has sequence predicates such as all?, none?, one? and any? which
take a block and evaluate that by passing every element of the sequence to it.
if queries.any? { |sql| /LEFT OUTER JOIN/i =~ sql }
logger.log "Left outer join detected"
end
Ruby 2.5 allows using a shorthand for this by
passing a pattern argument.
Internally case equality operator(===) is used against every element of the
sequence and the pattern argument.
if queries.any?(/LEFT OUTER JOIN/i)
logger.log "Left outer join detected"
end
# Translates to:
queries.any? { |sql| /LEFT OUTER JOIN/i === sql }
This allows us to write concise and shorthand expressions where block is only
used for comparisons. This feature is applicable to all?, none?, one? and
any? methods.
Similarities with Enumerable#grep
This feature is based on how Enumerable#grep works. grep returns an array of
every element in the sequence for which the case equality operator(===)
returns true by applying the pattern. In this case, the all? and friends
return true or false.
There is a proposal to add it for
select and reject as well.