This is normal Ruby semantics. Consider: method_name another_method do end In this case, the "do" is bound to method_name. Now consider: method_name another_method { } In this case, the {} is bound to another_method. Proc.new is just a normal method, so the above applies. -- Yehuda On Fri, Oct 16, 2009 at 10:48 AM, Iņaki Baz Castillo wrote: > > Hi, the following works: > > > 1 ::Rack::Builder.new do > 2 map "/" do > 3 run Proc.new { |env| > 4 [ 404, {"Content-Type" => "text/plain"}), > [""] ] > 5 } > 6 end > 7 end > > > but the following gives an error: > > 1 ::Rack::Builder.new do > 2 map "/" do > 3 run Proc.new do |env| > 4 [ 404, {"Content-Type" => "text/plain"}), > [""] ] > 5 end > 6 end > 7 end > > /home/me/myfile.rb:3:in `new': tried to create Proc object without a block > (ArgumentError) > from /home/me/myfile.rb:3:in `block (2 levels) in core' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:29:in > `instance_eval' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:29:in > `initialize' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:46:in > `new' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:46:in > `map' > from /root/svn_local_copies/OpenXDMS/trunk/lib/rack/core.rb:46:in `block in > core' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:29:in > `instance_eval' > from > /usr/local/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.0/lib/rack/builder.rb:29:in > `initialize' > from /home/me/myfile.rb:1:in `new' > ... > > > It fails in ruby 1.8 and 1.9. Why cannot I use "do-end" syntax for a block > instead of "{ }". Of course, Proc.new does allow "do-end" syntax, so I > wonder > if this issue has something to do with Rack itself. > > > Thanks. > > > -- > Iņaki Baz Castillo > -- Yehuda Katz Developer | Engine Yard (ph) 718.877.1325