"run Proc.new" using "do ... end" fails ("{ }" required)

2 views
Skip to first unread message

Iñaki Baz Castillo

unread,
Oct 16, 2009, 1:48:43 PM10/16/09
to Rack Development
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 <i...@aliax.net>

Yehuda Katz

unread,
Oct 16, 2009, 2:02:25 PM10/16/09
to rack-...@googlegroups.com
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
--
Yehuda Katz
Developer | Engine Yard
(ph) 718.877.1325

Iñaki Baz Castillo

unread,
Oct 16, 2009, 2:15:01 PM10/16/09
to rack-...@googlegroups.com
El Viernes, 16 de Octubre de 2009, Yehuda Katz escribió:
> 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.

Great explanation. Thanks a lot.

Reply all
Reply to author
Forward
0 new messages