[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Loading up a hash with variables if they are defined

Patrick Doyle

12/23/2008 4:51:00 PM

[Note: parts of this message were removed to make it a legal post.]

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.

--wpd

4 Answers

James Coglan

12/23/2008 4:58:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

>
> # 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.



params = [:prefix, :category_id, :page].inject({}) do |hash, name|
var = instance_variable_get("@#{name}")
hash[name] = var if var
hash
end

Jesús Gabriel y Galán

12/23/2008 5:05:00 PM

0

On Tue, Dec 23, 2008 at 5:51 PM, Patrick Doyle <wpdster@gmail.com> 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.
>


irb(main):005:0> {:prefix => @prefix, :category_id => @category, :page
=> @page}.reject {|k,v| v.nil?}
=> {:prefix=>"asdasdf", :category_id=>"cat"}

Jesus.

Patrick Doyle

12/23/2008 5:14:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

On Tue, Dec 23, 2008 at 11:57 AM, James Coglan <jcoglan@googlemail.com>wrote:

> >
> > # 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.
>
>
>
> params = [:prefix, :category_id, :page].inject({}) do |hash, name|
> var = instance_variable_get("@#{name}")
> hash[name] = var if var
> hash
> end
>
Thanks... that's certainly along the lines of what I was searching for.
I'll go read about #instance_variable_get now.

--wpd

Joel VanderWerf

12/23/2008 5:26:00 PM

0

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