Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Why is my var undefined?

Reply
Thread Tools

Why is my var undefined?

 
 
Tim
Guest
Posts: n/a
 
      02-03-2008
I'm new to ruby and I have the following code:

index=0
unsorted_array.each do |value|
if index==0
smallest=value
smallest_index=0
elsif value<smallest
smallest=value
smallest_index=index
end
index=index+1
end

When it gets to index 1, it crashes and says that smallest is
undefined (on the elsif line). Why is that, when it gets defined in
the first pass (index = 0) ?

Thanks for helping a newbie out.

Tim
 
Reply With Quote
 
 
 
 
Ilan Berci
Guest
Posts: n/a
 
      02-03-2008
Tim wrote:
> I'm new to ruby and I have the following code:
>
> index=0
> unsorted_array.each do |value|
> if index==0
> smallest=value
> smallest_index=0
> elsif value<smallest
> smallest=value
> smallest_index=index
> end
> index=index+1
> end
>
> When it gets to index 1, it crashes and says that smallest is
> undefined (on the elsif line). Why is that, when it gets defined in
> the first pass (index = 0) ?
>
> Thanks for helping a newbie out.
>
> Tim


It's only defined for the scope that it's in.. which is the "if" block..
Once it leaves that block and your code returns to the
"unsorted_array.each" scope, "smallest" is out of scope and therefore no
longer defined.

Dave Thomas has a free online version of Ruby 1.6 referred as the Pick
Axe book which discusses scope and I think you will find it very useful

hth

ilan

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Todd Benson
Guest
Posts: n/a
 
      02-03-2008
On Feb 2, 2008 6:09 PM, Tim <> wrote:
> I'm new to ruby and I have the following code:
>
> index=0


you could insert "smallest = nil" here

> unsorted_array.each do |value|
> if index==0
> smallest=value
> smallest_index=0
> elsif value<smallest
> smallest=value
> smallest_index=index
> end
> index=index+1
> end
>
> When it gets to index 1, it crashes and says that smallest is
> undefined (on the elsif line). Why is that, when it gets defined in
> the first pass (index = 0) ?


Not sure what you are trying to do, but if your data is not unique...

a = 5,1,4,7,2,1,9,2,1
smallest = a.min
s_indexes = []
a.each_with_index {|v, i| s_indexes << i if v == a.min}

If you don't want to do it that way, then...

a = 5,1,4,7,2,1,9,2,1
smallest, s_indexes = a.first, []
a.inject(a.first) {|m, e| e < m ? e : m}
a.each_with_index {|v, i| s_indexes << i if v == a.min}

Todd

 
Reply With Quote
 
Todd Benson
Guest
Posts: n/a
 
      02-03-2008
On Feb 2, 2008 11:05 PM, Todd Benson <> wrote:
> a.inject(a.first) {|m, e| e < m ? e : m}
> a.each_with_index {|v, i| s_indexes << i if v == a.min}



Sorry, these lines are supposed to be...

smallest = a.inject(a.first) {|m, e| e < m ? e : m}
a.each_with_index {|v, i| s_indexes << i if v <= smallest}

Todd

 
Reply With Quote
 
Isidor Isa
Guest
Posts: n/a
 
      02-03-2008
Todd Benson wrote:
> On Feb 2, 2008 11:05 PM, Todd Benson <> wrote:
>> a.inject(a.first) {|m, e| e < m ? e : m}
>> a.each_with_index {|v, i| s_indexes << i if v == a.min}

>
>
> Sorry, these lines are supposed to be...
>
> smallest = a.inject(a.first) {|m, e| e < m ? e : m}
> a.each_with_index {|v, i| s_indexes << i if v <= smallest}
>
> Todd


In Ruby 1.9, finding indexes of all elements which have minimal value
is easily done using a new iterator chaining feature:



a = 5, 1, 4, 7, 2, 1, 9, 2, 1

min_value = a.min



a.each_with_index.inject([]){|accum, (elem, index)|

elem == min_value ? accum << index : accum

}

Output:

=> [1, 5, 8]


Best regards
Isidor Nikolic
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Eivind Eklund
Guest
Posts: n/a
 
      02-03-2008
On Feb 3, 2008 1:09 AM, Tim <> wrote:
> I'm new to ruby and I have the following code:
>


Add
smallest = nil
smallest_index = 0
here, and your code will work.


> index=0
> unsorted_array.each do |value|
> if index==0
> smallest=value
> smallest_index=0
> elsif value<smallest
> smallest=value
> smallest_index=index
> end
> index=index+1
> end
>
> When it gets to index 1, it crashes and says that smallest is
> undefined (on the elsif line). Why is that, when it gets defined in
> the first pass (index = 0) ?


The variable is not "pass"-based - it is "scope" based, ie, it only
exists inside a particular *lexical* - that is, textual - part of your
program (in this case, your if statement, NOT the loop). In other
words, you get a new variable for each pass through the loop.

By adding the initialization, you get th same variable all loop iterations.

Here is another variant of your code that uses essensially the same
algorithm and simplifies the code a bit:

smallest_index = 0
smallest_value = nil
unsorted_array.each_with_index do |value, index|
if !smallest_value || value<smallest
smallest=value
smallest_index=index
end
end


Eivind.

 
Reply With Quote
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      02-03-2008
Ilan Berci wrote:
> It's only defined for the scope that it's in.. which is the "if" block


It's not local to the if-block. It's local to each execution of the each-
block.

HTH,
Sebastian
--
NP: Shape of Despair - Angels of Distress
Jabber:
ICQ: 205544826

 
Reply With Quote
 
Eivind Eklund
Guest
Posts: n/a
 
      02-03-2008
On Feb 3, 2008 11:50 AM, Eivind Eklund <> wrote:
> The variable is not "pass"-based - it is "scope" based, ie, it only
> exists inside a particular *lexical* - that is, textual - part of your
> program (in this case, your if statement, NOT the loop).


This was slightly clumsily written; the variable leak through to the
end of the block, but isn't present for the entire loop. Sebastians
description is correct.

Eivind.

 
Reply With Quote
 
Tim
Guest
Posts: n/a
 
      02-03-2008
Thanks to all for the help. I take it from the comments here that any
variables which are defined in an iteration block (or a Proc)are local
to each iteration. Thinking about it, that makes sense because each
iteration requires its own call from each (or each_with_index,
etc.)...with the variables being treated somewhat like method
variables.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
Difference between Session["var"] and Session("var") thomson ASP .Net 10 06-20-2005 01:02 PM
Difference between Session["var"] and Session("var") thomson ASP .Net 0 06-20-2005 10:54 AM
Threads.. Session var lost, App var ok Alvin Bruney ASP .Net 1 12-02-2003 01:56 AM
does "struct_name var = { 0 }; " fill var with 0? Fred C++ 3 08-10-2003 09:44 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57