Clicky

Harry R. Schwartz

Software engineer, nominal scientist, gentleman of the internet. Member, ←Hotline Webring→.

· 1B41 8F2C 23DE DD9C 807E A74F 841B 3DAE 25AE 721B

Naked Splats Pass Blocks

Published 21 Nov 2015. Tags: ruby.

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!