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:
- Is this functionality already tucked away somewhere else?
- How can I get rid of those nasty evals?