This gem defines kernel methods its
and it
that queue and defer method
calls. This is handy for list comprehension and case statements.
its
and it
extend the Symbol#to_proc idiom to support chaining multiple
methods.
When performing a list comprehension ruby, you can use a block argument:
users.map{ |user| user.contact }
Or, to avoid needing the block and and extra parameter, you can use the Symbol#to_proc
shortcut:
users.map &:contact
But if you want to chain several methods, such as:
users.map{ |user| user.contact.last_name.capitalize }
The Symbol#to_proc
shortcut doesn't help much. At best, if you're willing to accept intermediate arrays, you can do:
users.map(&:contact).map(&:last_name).map(&:capitalize)
To improve the situation, this gem provides a Kernel method its
, which lets you get the same shortcut advantages as Symbol#to_proc
but supports chaining:
users.map &its.contact.last_name.capitalize
Also, its
supports arguments and blocks, allowing you to do things like
users.map &its.contact.last_name[0,3].capitalize
users.select &its.contact.last_name.length > 10
users.select(&its.addresses.any? { |address| airline.flies_to address.city })
As a syntactic sugar, it
is an alias for its
, to use with methods that describe actions rather than posessives. For example:
items.map &it.to_s.capitalize
When used with hash comprehensions, the |key, val|
pair of arguments are presented to its
as a tuple that can be accessed array-like via [0]
or [1]
and/or struct-like via #key
and #value
methods. E.g.
{dogs: 1, cats: 2, goats:3}.select &its.key =~ /^c/ # => {cats: 2}
{dogs: 1, cats: 2, goats:3}.select &its.value.even? # => {cats: 2}
{dogs: 1, cats: 2, goats:3}.select &its[1].even? # => {cats: 2}
its
and it
similarly extend Ruby's case
mechanism to support testing
arbitrary methods, minimizing the need to create temporary variables. That is, instead of:
maxlen = arrays.map(&size).max
case
when maxlen > 10000 then "too big"
when maxlen < 10 then "too small"
else "okay"
end
You can use it
:
case arrays.map(&size).max
when it > 1000 then "too big"
when it < 10 then "too small"
else "okay"
end
Of course method chanining can be used here too:
case users.first
when its.name == "Gimme Cookie" then ...
when its.name.length > 10 then ...
else ...
end
The it
method creates an instance of the ItsIt::It
class, which uses method_missing
to capture and queue up all
methods and their arguments except for :to_proc
and :===
(and
also excepting :respond_to? :to_proc
and :respond_to? :===
).
:to_proc
returns a proc that will evaluate the method queue on a given
argument. :===
takes an argument and evaluates that proc, returning the
result.
Install as usual from http://rubygems.org via
$ gem install "its-it"
or in a Gemfile
gem "its-it"
Tested on MRI ruby 2.7.1
(MRI ruby 1.9.3, 2.1.9, 2.2.5, and 2.3.1 were supported up through version 1.3.0)
(MRI ruby 1.8.7 was supported up through version 1.1.1)
Release Notes
- 2.0.0 Switch to Ruby 2.7 keyword syntax. No other breaking changes.
- 1.3.0 Add
#key
and#value
for Hash comprehensions; plus minor internal cleanup. - 1.2.1 Don't leak all of ItsIt into main, just ItsIt::Kernel. Thanks to klg
- 1.2.0 Add support for Hash comprehensions; drop support for ruby 1.8.7
- 1.1.1 Remove dependency on BlankSlate
This gem is orignally based on Jay Philips' methodphitamine gem. It has been made available on rubygems.org, and updated over the years.