Dave Thomas just pointed out a great little hack from the Ruby Extensions Project. They added this little snippet to Object:

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end

and now instead of writing this:

result = names.map {|name| name.upcase}

you can write this:

result = names.map(&:upcase)

The “wave this method over all objects in a collection” idiom is very common in Ruby, and Ruby’s native block syntax isn’t too bad for this use, but it’s not as clean as Python’s list comprehension syntax would be:

result = [n.upper() for n in names]

With the to_proc hack in place, Ruby’s code is a bit cleaner, at the cost of using a non-standard extension to the language. Personally, I’d prefer to see map extended to take an optional symbol, then we could ditch the ugly & when we’re using a single method with no parameters.