Jacob Fugal
1/5/2006 5:13:00 PM
On 1/4/06, dblack@wobblini.net <dblack@wobblini.net> wrote:
> On Thu, 5 Jan 2006, Mark J.Reed wrote:
>
> > Okay, this is probably a dumb question, but how do I declare an
> > optional block parameter with a default value?
> >
> > I tried several variations on this basic theme:
> >
> > def meth(&block = lambda { |i| ... })
> > ...
> > end
>
> The &block thing is a special dispensation from Ruby, letting you grab
> the block but not serving as a normal argument. The way I've always
> seen this done is:
>
> def meth(&block)
> block ||= lambda { ... }
> ...
> end
But keep in mind that assigning to block inside the method doesn't
affect the behavior of yield:
irb> def test(&block)
irb> block ||= lambda{ puts "default" }
irb> yield
irb> end
=> nil
irb> test
LocalJumpError: no block given
So if you need a default block and currently use yield, you'll either
need to branch on block_given? (as suggested by James), or just use
block.call instead of yield. The latter is probably preferrable, but
may have subtle differences in parameter assignment if it matters.
Jacob Fugal