Binary Solo

Maximum flexibility in Ruby method arguments with the splat operators

posted by Ayush Newatia on June 18th, 2021
Ruby has got to be one of the most malleable programming languages out there, which is why I like it so much.

Recently I was adding breadcrumbs to a Rails app and wrote a drop_breadcrumb method that could be called in a controller or controller action.

I wanted the call site to look like:

class MyController < ApplicationController
  drop_breadcrumb "Home", :home_path, except: :index
 
  def show
    drop_breadcrumb "Profile"
  end
end

As demonstrated above, only the first argument is compulsory. So I need a method signature that accepts:
 
  • A single argument for the label
  • Two arguments for the label and path
  • Two arguments for the label and an options hash
  • Three arguments for the label, path and an options hash

Ruby has the * (splat) and ** (double splat) operators for just that kind of flexibility! The splat operator allows a method to take a undefined number of arguments and the double splat operators allows an undefined number of keyword arguments.

Combining the two in the method definition will let us pass in any number of arguments with an optional options hash at the end! args can be then deconstructed into the individual values we need and we can use options like a regular Ruby hash:

def drop_breadcrumb(*args, **options)
  label, path = args
  
  ...
end
 
It's always good to bear in mind to only use this level of flexibility when absolutely required as it's not very expressive for a reader. With the right use case though, as demonstrated above, it's a great tool to have in your toolbox!

Subscribe to Binary Solo


We'll send you an email every time a new post is published. We'll never spam you or sell your email address to third parties. Check out our privacy policy for details.