From: Phil Tomson Date: 2006-07-09T04:45:53+09:00 Subject: Re: Sweet Lord! On 7/8/06, dblack@wobblini.net wrote: > Hi -- > > On Sun, 9 Jul 2006, Phil Tomson wrote: > > > On 7/8/06, William James wrote: > >> Daniel Schierbeck wrote: > >> > Why haven't I thought of this before? > >> > > >> > class Terminal > >> > include Enumerable > >> > > >> > def each(&block) > >> > while input = gets > >> > block.call(input.chomp) > >> > end > >> > end > >> > >> def each > >> while input = gets > >> yield input.chomp > >> end > >> end > > > > Equivilent code, actually. It's a case of "you say tomaTOE I say tomAHto" > > Personally, I tend to prefer the 'block.call' because you explicitly > > say you're passing in a block in the definition of the method, so if > > someone is reading your code they can easily tell that the method > > takes a block. In the case of yield you might need to read through a > > good bit of code before you find out that the method takes a block. > > It does seem that yielding is faster; note the effect of turning the > block into a Proc object: > > require 'benchmark' > include Benchmark > > n = 100000 > > def y > end > > def b(&block) > end > > bm do |x| > x.report("call") { n.times { b { } } } > x.report("yield") { n.times { y { } } } > end > > # Output: > > user system total real > call 1.860000 0.040000 1.900000 ( 2.874001) > yield 0.220000 0.000000 0.220000 ( 0.249164) > That is a fairly significant difference, so maybe I should revise my statement to say that the two different ways acheive the same effect ignoring differences in runtime ;-) Phil