27

I want to store a "code block" in a variable to be reused, something like:

block = do
|test| puts test
end

3.upto(8) block

Can someone show me what am I doing so obviously wrong? (Or if it's just impossible)

sawa
  • 165,429
  • 45
  • 277
  • 381

1 Answers1

40

There are many ways to do this in Ruby, one of which is to use a Proc:

foo = Proc.new do |test|
  puts test
end

3.upto(8) { foo.call("hello world") }

Read more about Procs:

Update, the above method could be rewritten as follows:

# using lower-case **proc** syntax, all on one line
foo = proc { |test| puts test }
3.upto(8) { foo.call("hello world") }

# using lambda, just switch the method name from proc to lambda
bar = lambda { |test| puts test }
3.upto(8) { bar.call("hello world") } 

They're basically very similar methods, with subtle differences.

And finally, there are probably more elegant ways to do what I've outlined, be good to hear from anyone with a better way. Hope this helps.

Iulian Onofrei
  • 9,188
  • 10
  • 67
  • 113
stephenmurdoch
  • 34,024
  • 29
  • 114
  • 189
  • 2
    Thanks a lot. For the link even more. Can you be so kind as to include a mention of lambdas as well? For historical purpose. –  Oct 07 '12 at 00:34
  • @Shingetsu, I added and update with lambda, as well as a slightly simplified version of the proc approach too – stephenmurdoch Oct 07 '12 at 00:47
  • 3
    @Shingetsu: Lambdas aren't historical. You should almost *always* use them instead of Procs. They are much more fully featured and are the standard. – Linuxios Oct 07 '12 at 01:11
  • @Linuxios by historical I mean "people who will later come see the post". I read the page and saw that lambdas make more sense. –  Oct 07 '12 at 14:04
  • @Shingetsu: Oh! Sorry about that. We all misinterpret sometimes. – Linuxios Oct 07 '12 at 14:06