What the...?

Take a look on the snippet below

points is an array of structure-objects defining a point

points[0].x = 5
points[0].y = 4
1.upto(points.length) { |i|
points[i].x = points[i-1].x
points[i].y = points[i-1].y
}

Now that looks like a legal bunch of statements, right? The thing is
every time Ruby interpret the line ‘points[i].x = points[i-1].x’ it
stops, giving me nothing but a cryptic error message, ‘undefined
method `x=’ for nil (NameError)’.
Could someone please tell me what’s going on?

-johan

Johan Persson wrote:

Take a look on the snippet below

points is an array of structure-objects defining a point

points[0].x = 5
points[0].y = 4
1.upto(points.length) { |i|
points[i].x = points[i-1].x
points[i].y = points[i-1].y
}

Now that looks like a legal bunch of statements, right? The thing is
every time Ruby interpret the line ‘points[i].x = points[i-1].x’ it
stops, giving me nothing but a cryptic error message, ‘undefined
method `x=’ for nil (NameError)'.
Could someone please tell me what’s going on?

Array indexing starts at 0.
1.upto iterates including points.length, which doesn’t exist, meaning
returns nil… and you can guess the rest.

Try
0.upto(points.length-1) { |i|
instead.

···


([ Kent Dahl ]/)_ ~ [ http://www.stud.ntnu.no/~kentda/ ]/~
))_student
/(( _d L b_/ NTNU - graduate engineering - 5. year )
( __õ|õ// ) )Industrial economics and technological management(
_
/ö____/ (_engineering.discipline=Computer::Technology)

Easy one; when you do points[i].x=… you’re calling the ‘x=’ method of
the points[i] object, which happens to be nil, for points[1] == nil.
You’re thinking in C++ or Java; Ruby uses accessors.

···

On Tue, Nov 12, 2002 at 05:47:02AM +0900, Johan Persson wrote:

Take a look on the snippet below

points is an array of structure-objects defining a point

points[0].x = 5
points[0].y = 4
1.upto(points.length) { |i|
points[i].x = points[i-1].x
points[i].y = points[i-1].y
}

Now that looks like a legal bunch of statements, right? The thing is
every time Ruby interpret the line ‘points[i].x = points[i-1].x’ it
stops, giving me nothing but a cryptic error message, ‘undefined
method `x=’ for nil (NameError)'.
Could someone please tell me what’s going on?


_ _

__ __ | | ___ _ __ ___ __ _ _ __
'_ \ / | __/ __| '_ _ \ / ` | ’ \
) | (| | |
__ \ | | | | | (| | | | |
.__/ _,
|_|/| || ||_,|| |_|
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

Whoa…I did a ‘zcat /vmlinuz > /dev/audio’ and I think I heard God…
– mikecd on #Linux

Allright. Thanks a million everybody. :slight_smile:

Actually, becuase he’s manually handling index 0, he would want:

1.upto(points.length - 1) { |i| … }

-austin
– Austin Ziegler, austin@halostatue.ca on 2002.11.11 at 15.54.29

···

On Tue, 12 Nov 2002 05:47:09 +0900, Kent Dahl wrote:

Johan Persson wrote:

Take a look on the snippet below

points is an array of structure-objects defining a point

points[0].x = 5
points[0].y = 4
1.upto(points.length) { |i|
points[i].x = points[i-1].x
points[i].y = points[i-1].y
}

Now that looks like a legal bunch of statements, right? The thing
is every time Ruby interpret the line ‘points[i].x =
points[i-1].x’ it stops, giving me nothing but a cryptic error
message, ‘undefined method `x=’ for nil (NameError)'. Could
someone please tell me what’s going on?
Array indexing starts at 0.
1.upto iterates including points.length, which doesn’t exist,
meaning returns nil… and you can guess the rest.

Try
0.upto(points.length-1) { |i|
instead.