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 super
will
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 textually similar articles: