Ruby Ruby Blocks Working With Blocks Build a Simple Benchmarker

Michael Kristensen
Michael Kristensen
5,608 Points

Curly-Braces Vs. Do-End - One works, the other does not, but why?

Due to a bit of a habit working with curly-braces, I have gotten to the point where I use them instead of the Do-End structure Jason suggests for multi-line blocks, more or less experiencing them as synonymous in most situations, but then I ran in to the situation where:

class SimpleBenchmarker
  def run(description, &block)
    start_time = Time.now
    block.call
    end_time = Time.now
    elapsed = end_time - start_time
    puts "\n"
    puts "#{description} results"
    puts "Elapsed time: #{elapsed} seconds"
  end
end

benchmarker = SimpleBenchmarker.new
benchmarker.run "Sleep a random amount of time" {
  5.times {
    print "."
    sleep(rand(0.1..1.0))
  }
}       

does not work, with an error message of:

simple_benchmarker.rb:14: syntax error, unexpected '{', expecting end-of-input
...leep a random amount of time" {
...

but the following code block working just fine:

class SimpleBenchmarker
  def run(description, &block)
    start_time = Time.now
    block.call
    end_time = Time.now
    elapsed = end_time - start_time
    puts "\n"
    puts "#{description} results"
    puts "Elapsed time: #{elapsed} seconds"
  end
end

benchmarker = SimpleBenchmarker.new
benchmarker.run "Sleep a random amount of time" do
  5.times do
    print "."
    sleep(rand(0.1..1.0))
  end
end     

Does anyone know what the difference is here?

1 Answer

KRIS NIKOLAISEN
PRO
KRIS NIKOLAISEN
Pro Student 50,936 Points

After reading this stack overflow I added parentheses and the code ran with curly braces

benchmarker.run ("Sleep a random amount of time") {