From: Joel VanderWerf Date: 2008-12-24T02:26:17+09:00 Subject: Re: Loading up a hash with variables if they are defined Patrick Doyle wrote: > Is there a cleaner, more Rubyesque way to do this? > > # Return a hash of the navigation parameters > def nav_params > params = {} > > params[:prefix] = @prefix if @prefix > params[:category_id] = @category_id if @category_id > params[:page] = @page if @page > > params > end > > I want to load a parameters hash with the contents of some instance > variables, but only if they are defined. Watch out: "only if they are defined" is not the same as "only if they are not nil or false". If you want the former, then this might be what you are looking for: class C NAV_VARS = %w{ @prefix @category_id @page } NAV_VAR_KEYS = NAV_VARS.inject({}) {|h,v| h[v] = v.delete("@").to_sym; h} def nav_params (instance_variables & NAV_VARS).inject({}) do |params,var| params[NAV_VAR_KEYS[var]] = instance_variable_get(var) params end end end c = C.new c.instance_eval do @prefix = "foo" @page = false end p c.nav_params # ==> {:prefix=>"foo", :page=>false} -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407