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
But I keep getting syntax errors. Help?
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
I don’t think there’s a way to do it inside the arglist.
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.
Thanks to all who posted. The upshot seems to be that I need to declare
the method with no block in the signature, and then check block_given?
within the body and manually invoke a default block if none was passed
in.
Which is basically the solution I arrived at, although I had forgotten
about
block_given? and was trapping the LocalJumpError to achieve the same
result.