What do you call the &: operator in Ruby?

Possible Duplicates: Ruby/Ruby on Rails ampersand colon shortcut What does map(&:name) mean in Ruby?

I was reading Stackoverflow and stumbled upon the following code

array.map(&:to_i)

Ok, it's easy to see what this code does but I'd like to know more about &: construct which I have never seen before.

Unfortunately all I can think of is "lambda" which it is not. Google tells me that lambda syntax in Ruby is ->->(x,y){ x * y }

So anyone knows what that mysterious &: is and what it can do except calling a single method?

Answers


There's a few moving pieces here, but the name for what's going on is the Symbol#to_proc conversion. This is part of Ruby 1.9 and up, and is also available if you use later-ish versions of Rails.

First, in Ruby, :foo means "the symbol foo", so it's actually two separate operators you're looking at, not one big &: operator.

When you say foo.map(&bar), you're telling Ruby, "send a message to the foo object to invoke the map method, with a block I already defined called bar". If bar is not already a Proc object, Ruby will try to make it one.

Here, we don't actually pass a block, but instead a symbol called bar. Because we have an implicit to_proc conversion available on Symbol, Ruby sees that and uses it. It turns out that this conversion looks like this:

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

This makes a proc which invokes the method with the same name as the symbol. Putting it all together, using your original example:

array.map(&:to_i)

This invokes .map on array, and for each element in the array, returns the result of calling to_i on that element.


Need Your Help

DelegatingHandler for response in WebApi

c# asp.net-mvc-4 asp.net-web-api .net-4.5 dotnet-httpclient

I am currently using several delegation handlers (classes derived from DelegatingHandler) to work on the request before it is sent, for things like validating a signature etc. This is all very nice,

How to create a copy of a directory on Linux with links

linux directory hardlink

I have a series of directories on Linux and each directory contains lots of files and data. The data in those directories are automatically generated, but multiple users will need to perform more