I want to write this ["foo", "bar"].map {|x| x.capitalize}
as something like this ["foo", "bar"].map(&method(:String.capitalize))
To be more precise, given a list L
of instances of C
and an instance method M
I want to call M
on each element of L
as element.M
, in a point-free maner
CodePudding user response:
What you're looking for is ["foo", "bar"].map(&:capitalize)
.
How does this work?
:capitalize
is a just a plain ol' ruby symbol. The magic item here is the ampersand which can be used as a prefix to a method argument; the &
automatically invokes to_proc
on the item that it prefixes:
x = test(&Bar) # call Bar.to_proc
To put it all together, the implementation of to_proc
on Symbol
returns a proc that invokes the method with the given name; something like:
class Symbol
def to_proc
Proc.new { |object, *args| object.send(self, *args) }
end
end