Quoting Joe Van Dyk <joevandyk / gmail.com>: > 5.times { |i| puts i } > > 5.times do |i| > puts i > end > Generally people save do .. end for multiline stuff. Don't think > there's a difference in speed. I can promise there's no speed difference. They both parse to the same thing: (iter (call (lit #<5>) times) (dasgn_curr i) (fcall puts (array (dvar i)))) (iter (call (lit #<5>) times) (dasgn_curr i) (fcall puts (array (dvar i)))) However, {} and do...end are not totally interchangable as syntax. These are all equivalent: obj.meth( 1, 2 ) { |i| puts i } obj.meth( 1, 2 ) do |i| puts i end obj.meth 1, 2 do |i| puts i end But this will net you a parse error ('2' is not a valid method name): obj.meth 1, 2 { |i| puts i } And these two parse equivalently: obj.meth 1, zog { |i| puts i } obj.meth( 1, zog { |i| puts i } ) Think of {} as being more "clingy" than do...end. Basically, {} has higher precedence than do...end, just as (among otherwise equivalent operators) && has higher precedence than 'and', and || has higher precedence than 'or'. I'm sure Ter hates Ruby now. :) -mental