Naked Splats Pass Blocks
Occasionally in Ruby I want to add some extra behavior to a method in a
subclass, like creating an extra instance variable or triggering a callback. In
cases like that, I generally want to receive the same arguments as in the
superclass and pass them along through a call to
super. Ruby makes that pretty
easy; I can put a “naked splat” in the arguments list and
automagically pass along those same arguments:
class B < A def initialize(*) super do_an_extra_thing end end
However, I can never remember if
(*) passes along a block argument. Well,
it does! Here’s proof:
class A def upcase_and_call_block(bar, &block) puts bar.upcase block.call end end class B < A def upcase_and_call_block(*) super puts "Done!" end end B.new.upcase_and_call_block("test string") do puts "Called the block!" end
The output of this is:
TEST STRING Called the block! Done!
So, there ya go: the naked splat passes blocks.
I only need to know this once a year or so. I inevitably forget it, try to search for it, find nothing, and have to repeat the experiment above. Maybe I’ll find this article in the future!
You might like these related articles: