Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass a function by name in Ruby

How can you pass a function by name in Ruby? (I've only been using Ruby for a few hours, so I'm still figuring things out.)

nums = [1, 2, 3, 4]

# This works, but is more verbose than I'd like    
nums.each do |i|
  puts i
end

# In JS, I could just do something like:
# nums.forEach(console.log)

# In F#, it would be something like:
# List.iter nums (printf "%A")

# In Ruby, I wish I could do something like:
nums.each puts

Can it be done similarly concisely in Ruby? Can I just reference the function by name instead of using a block?

People voting to close: Can you explain why this isn't a real question?

like image 593
Nick Heiner Avatar asked Dec 10 '12 21:12

Nick Heiner


2 Answers

You can do the following:

nums = [1, 2, 3, 4]
nums.each(&method(:puts))

This article has a good explanation of the differences between procs, blocks, and lambdas in Ruby.

like image 53
Chris Schmich Avatar answered Oct 27 '22 21:10

Chris Schmich


Can I just reference the function by name instead of wrapping it in a block?

You aren't 'wrapping' it -- the block is the function.

If brevity is a concern, you can use brackets instead of do..end:

nums.each {|i| puts i}
like image 25
zetetic Avatar answered Oct 27 '22 19:10

zetetic