what is the functionality of "&: " operator in ruby?

Ruby

Ruby Problem Overview


> Possible Duplicate:
> What does map(&:name) mean in Ruby?

I came across a code snippet which had the following

a.each_slice(2).map(&:reverse)

I do not know the functionality of &: operator. How does that work?

Ruby Solutions


Solution 1 - Ruby

There isn't a &: operator in Ruby. What you are seeing is the & operator applied to a :symbol.

In a method argument list, the & operator takes its operand, converts it to a Proc object if it isn't already (by calling to_proc on it) and passes it to the method as if a block had been used.

my_proc = Proc.new { puts "foo" }

my_method_call(&my_proc) # is identical to:
my_method_call { puts "foo" }

So the question now becomes "What does Symbol#to_proc do?", and that's easy to see in the Rails documentation:

> Turns the symbol into a simple proc, which is especially useful for enumerations. Examples:

# The same as people.collect { |p| p.name }
people.collect(&:name)

# The same as people.select { |p| p.manager? }.collect { |p| p.salary }
people.select(&:manager?).collect(&:salary)

Solution 2 - Ruby

By prepending & to a symbol you are creating a lambda function that will call method with a name of that symbol on the object you pass into this function. Taking that into account:

ar.map(&:reverse)

is roughly equivalent to:

ar.map { |element| element.reverse }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRahulView Question on Stackoverflow
Solution 1 - RubyGarethView Answer on Stackoverflow
Solution 2 - RubyKL-7View Answer on Stackoverflow