Correct use of block

Hi

I’ve been using Python for years, but looking into Ruby and rails.

Is the following a sensible way to use Ruby blocks?

def time_method()
t1=Time.now
if block_given?
result=yield()
end
return Time.now-t1,result
end

t,rsp=time_method do
Net::HTTP.get_response(URI.parse(url).host, URI.parse(url).path)
end

My problem is that both time_method and get_response returns a value
that i need. Should i use a closure instead of the above?

Thanks.

On Mon, Nov 29, 2010 at 1:50 PM, Martin [email protected] wrote:

end
Thanks.

Personally, I think this is quite reasonable. I might rename the method
something like “call_and_time”, and I’d probably leave off the empty
parens
after the method name and the yield.

On 11/29/2010 07:45 PM, Martin wrote:

end

t,rsp=time_method do
Net::HTTP.get_response(URI.parse(url).host, URI.parse(url).path)
end

My problem is that both time_method and get_response returns a value
that i need. Should i use a closure instead of the above?

No, that’s perfectly OK. I would just do minor changes and leave out
the test for block. Your method does not make sense without a block so
I’d just let it throw:

def time_method
t = Time.now
r = yield
Time.now - t, r
end

I’d probably change the order of return values since the result of the
block could be viewed as the more important result.

Kind regards

robert

On Mon, Nov 29, 2010 at 11:50 AM, Martin [email protected] wrote:

My problem is that both time_method and get_response returns a value
that i need. Should i use a closure instead of the above?

You can do

rsp = nil
t=time_method do
rsp = Net::HTTP.get_response(URI.parse(url).host,
URI.parse(url).path)
end

Since rsp was bound outside the scope of a block, it gets closed over,
so
rebinding it will alter the outer variable (unlike Python’s lambdas, or
most
other languages for that matter)

You might consider using Ruby’s built-in “benchmark” library as well:

require “benchmark”

rsp = nil
puts Benchmark.measure do
rsp = Net::HTTP.get_response(URI.parse(url).host, URI.parse(url).path)
end