[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

test to see if a variable exists

Colin Summers

6/15/2007 8:36:00 PM

So I am stealing all these identities and storing everything in a big
array of objects stolen_identity, and having the index be social
security numbers:

ss[34323843] = Stolen_identity.new

But say I pick up a paycheck stub and it has 3428294. How do I know if
I already have it? Does
if (exist ss[3428294]) then ... end
work? How can I see if a variable exists?

Thanks.

(please include your social security with your answer)

4 Answers

Gavin Kistner

6/15/2007 9:25:00 PM

0

On Jun 15, 2:36 pm, "Colin Summers" <blade...@gmail.com> wrote:
> So I am stealing all these identities and storing everything in a big
> array of objects stolen_identity, and having the index be social
> security numbers:
>
> ss[34323843] = Stolen_identity.new
>
> But say I pick up a paycheck stub and it has 3428294. How do I know if
> I already have it? Does
> if (exist ss[3428294]) then ... end
> work? How can I see if a variable exists?

Arrays (and Hashes) in Ruby are sparse - they only store the values
you actually enter. However, there are some limitations on the size of
indices for arrays:

C:\>irb

irb(main):001:0> ss = []
=> []

irb(main):002:0> ss[ 884_56_2103 ] = "I HAVE YOU NOW"
ArgumentError: index too big
from (irb):2:in `[]='
from (irb):2

So, you probably want to use a Hash, which has no such limitation.
With both Arrays and Hashes, supplying a key or index which has no
stored value will return a nil object:

irb(main):003:0> ss = {}
=> {}

irb(main):004:0> ss[ 884_56_2103 ] = "I HAVE YOU NOW"
=> "I HAVE YOU NOW"

irb(main):005:0> ss[ 912_34_3552 ]
=> nil

In Ruby, nil and false are both non-truth values for the purposes of
boolean logic. Additionally (and slightly more cleanly), you can ask a
Hash directly if it has an entry for a specific key:

irb(main):006:0> if ss.has_key?( 884_56_2103 ) then
irb(main):007:1* puts "I'm done with this guy"
irb(main):008:1> else
irb(main):009:1* puts "Sweet new information!"
irb(main):010:1> end
I'm done with this guy

Morton Goldberg

6/15/2007 9:58:00 PM

0

On Jun 15, 2007, at 4:36 PM, Colin Summers wrote:

> So I am stealing all these identities and storing everything in a big
> array of objects stolen_identity, and having the index be social
> security numbers:
>
> ss[34323843] = Stolen_identity.new
>
> But say I pick up a paycheck stub and it has 3428294. How do I know if
> I already have it? Does
> if (exist ss[3428294]) then ... end
> work? How can I see if a variable exists?
>
> Thanks.
>
> (please include your social security with your answer)

Using a hash is the way to go here. You've already been advised to do
that. But here is an example that may give you some additional insight.

<code>
class Identity
def initialize(ss)
@ss = ss
end
def process
puts "#{@ss}: I've been stolen!"
end
end

Stolen = {}

ss1 = '123-12-1234'
ss2 = '789-78-7890'
Stolen[ss1] = Identity.new(ss1)

# One way
Stolen[ss1].process if Stolen[ss1] # process runs
Stolen[ss2].process if Stolen[ss2] # process does not run

# Another way
Stolen[ss1].process rescue nil # process runs
Stolen[ss2].process rescue nil # process does not run
</code>

There are many other ways, but they all rely on same thing: that
Stolen[ss2] returns nil and nil is treated as false in boolean
expressions.

Regards, Morton



John Joyce

6/16/2007 1:04:00 PM

0


On Jun 15, 2007, at 4:58 PM, Morton Goldberg wrote:

> On Jun 15, 2007, at 4:36 PM, Colin Summers wrote:
>
>> So I am stealing all these identities and storing everything in a big
>> array of objects stolen_identity, and having the index be social
>> security numbers:
>>
>> ss[34323843] = Stolen_identity.new
>>
>> But say I pick up a paycheck stub and it has 3428294. How do I
>> know if
>> I already have it? Does
>> if (exist ss[3428294]) then ... end
>> work? How can I see if a variable exists?
>>
>> Thanks.
>>
>> (please include your social security with your answer)
>
> Using a hash is the way to go here. You've already been advised to
> do that. But here is an example that may give you some additional
> insight.
>
> <code>
> class Identity
> def initialize(ss)
> @ss = ss
> end
> def process
> puts "#{@ss}: I've been stolen!"
> end
> end
>
> Stolen = {}
>
> ss1 = '123-12-1234'
> ss2 = '789-78-7890'
> Stolen[ss1] = Identity.new(ss1)
>
> # One way
> Stolen[ss1].process if Stolen[ss1] # process runs
> Stolen[ss2].process if Stolen[ss2] # process does not run
>
> # Another way
> Stolen[ss1].process rescue nil # process runs
> Stolen[ss2].process rescue nil # process does not run
> </code>
>
> There are many other ways, but they all rely on same thing: that
> Stolen[ss2] returns nil and nil is treated as false in boolean
> expressions.
>
> Regards, Morton
>
>
>
An array could indeed work. Think about the structure of a SSN:
377-23-4736 (not a real one)
That looks like a multi-dimensional array to me.
each part is limited: 3 digits, 2 digits, 4 digits.
Much like IPv4 this can produce a lot of distinct numbers.
These smaller parts are easier to process, possibly less overhead.

Morton Goldberg

6/16/2007 3:45:00 PM

0

On Jun 16, 2007, at 9:03 AM, John Joyce wrote:

>
> On Jun 15, 2007, at 4:58 PM, Morton Goldberg wrote:
>
>> On Jun 15, 2007, at 4:36 PM, Colin Summers wrote:
>>
>>> So I am stealing all these identities and storing everything in a
>>> big
>>> array of objects stolen_identity, and having the index be social
>>> security numbers:
>>>
>>> ss[34323843] = Stolen_identity.new
>>>
>>> But say I pick up a paycheck stub and it has 3428294. How do I
>>> know if
>>> I already have it? Does
>>> if (exist ss[3428294]) then ... end
>>> work? How can I see if a variable exists?
>>>
>>> Thanks.
>>>
>>> (please include your social security with your answer)
>>
>> Using a hash is the way to go here. You've already been advised to
>> do that. But here is an example that may give you some additional
>> insight.
>>
>> <code>
>> class Identity
>> def initialize(ss)
>> @ss = ss
>> end
>> def process
>> puts "#{@ss}: I've been stolen!"
>> end
>> end
>>
>> Stolen = {}
>>
>> ss1 = '123-12-1234'
>> ss2 = '789-78-7890'
>> Stolen[ss1] = Identity.new(ss1)
>>
>> # One way
>> Stolen[ss1].process if Stolen[ss1] # process runs
>> Stolen[ss2].process if Stolen[ss2] # process does not run
>>
>> # Another way
>> Stolen[ss1].process rescue nil # process runs
>> Stolen[ss2].process rescue nil # process does not run
>> </code>
>>
>> There are many other ways, but they all rely on same thing: that
>> Stolen[ss2] returns nil and nil is treated as false in boolean
>> expressions.
>>
>> Regards, Morton
>>
> An array could indeed work. Think about the structure of a SSN:
> 377-23-4736 (not a real one)
> That looks like a multi-dimensional array to me.
> each part is limited: 3 digits, 2 digits, 4 digits.
> Much like IPv4 this can produce a lot of distinct numbers.
> These smaller parts are easier to process, possibly less overhead.

I don't doubt that Identity objects could be indexed into some kind
of array, but I do think the hash approach is simpler and easier to
implement. I'd be happy to be convinced otherwise. How about posting
some code to prove your point?

Regards, Morton