What's a nice clean way to use an options hash with defaults values as a parameter in ruby

def foo(options = {})
  options = { ... defaults ... }.merge(options)
end

If you're using Rails (not just plain Ruby), a slightly shorter method is

def foo(options = {})
  options.reverse_merge! { ... defaults ... }
end

This has the added advantage of allowing you to do multiple lines a tad bit more cleanly:

def foo(options = {})
  options.reverse_merge!(
    :some_default => true,
    :other_default => 5
  )
end

It's usually best to encapsulate safe defaults in a Hash that's declared as a constant. For example:

require 'ostruct'

require 'ostruct'

class Tiger < OpenStruct
  DEFAULTS = {
    :num_stripes => 12,
    :max_speed => 43.2
  }.freeze

  def initialize(options = { })
    super(DEFAULTS.merge(options))
  end
end

tiger = Tiger.new(:max_speed => 19.95)

puts tiger.max_speed
puts tiger.num_stripes

It is important to note when merging Hash objects that String and Symbol keys are different and will not be combined as you might expect. In the Rails environment, you can always convert one to the other using Hash#symbolize_keys or by declaring them as HashWithIndifferentAccess which maps away the difference for you.

Tags:

Ruby

Hash