What do you call the &: operator in Ruby?

ruby

Solution

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.

Problem

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?

Original source

Related problems