Nick Heiner
Nick Heiner

Reputation: 122600

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?

Upvotes: 5

Views: 365

Answers (3)

Dave Newton
Dave Newton

Reputation: 160311

Not out-of-the-box, although you can use method:

def invoke(enum, meth)
  enum.each { |e| method(meth).call(e) }
end

I prefer it wrapped up into a monkeypatched Enumerable.

There are other ways to go about this, too; this is kind of brute-force.

Upvotes: 0

zetetic
zetetic

Reputation: 47578

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}

Upvotes: 3

Chris Schmich
Chris Schmich

Reputation: 29524

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.

Upvotes: 6

Related Questions