From: Leslie Viljoen Date: 2009-10-27T00:32:50+09:00 Subject: Setting instance variables from hash parameters (with defaults) Hi! I'm sure I might be reinventing the wheel here. I was writing the following ugly code in order to set options (with defaults) from a hash: def initialize(opts = {}) @select_max = opts.has_key?(:select_max) ? opts[:select_max] : 10000 @select_try = opts.has_key?(:select_try) ? opts[:select_try] : 1000 @min_sleep_sec = opts.has_key?(:min_sleep_sec) ? opts[:min_sleep_sec] : 5 @max_sleep_sec = opts.has_key?(:max_sleep_sec) ? opts[:max_sleep_sec] : 1800 @default_sleep = opts.has_key?(:default_sleep) ? opts[:default_sleep] : 10 .... So to avoid that I wrote: module Defaulting def set_params(defs, params) defs.each do |name, val| if params.has_key?(name) eval "@#{name} = params[name]" else eval "@#{name} = val" end end end end So that I could do the much nicer: include Defaulting def initialize(opts = {}) defs = { :select_max => 10000, :select_try => 1000, :min_sleep_sec => 5, :max_sleep_sec => 1800, :default_sleep => 10 } set_params(defs, opts) .... Note that this allows me to pass options that are explicitly set to nil. Now: 1. Is this functionality already tucked away somewhere else? 2. How can I get rid of those nasty evals?