Beginner Question on Ruby

A

Arun Kumar

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

Hi all,

I am beginning to learn ruby and cant seem to reason this behaviour. I
expect since empty or nill is the array, arr*n shouldnt change it.

Why is this behaviour so?

Code:

num_arr = Array.new
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"
puts "Num Alpha: #{num_arr << num_arr} and size: #{num_arr.size}"
num_arr.insert(-1, num_arr << num_arr)
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"

Output:

Num Alpha: and size: 0
Num Alpha: [...] and size: 1
Num Alpha: [...][...][...][...][...][...][...][...][...] and size: 3
 
D

David A. Black

Hi --

Hi all,

I am beginning to learn ruby and cant seem to reason this behaviour. I
expect since empty or nill is the array, arr*n shouldnt change it.

Why is this behaviour so?

Code:

num_arr = Array.new
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"
puts "Num Alpha: #{num_arr << num_arr} and size: #{num_arr.size}"
num_arr.insert(-1, num_arr << num_arr)
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"

Output:

Num Alpha: and size: 0
Num Alpha: [...] and size: 1
Num Alpha: [...][...][...][...][...][...][...][...][...] and size: 3

You're inserting an array into itself. Ruby represents that kind of
recursive inclusion with dots.

irb(main):005:0> a = []
=> []
irb(main):006:0> a << a
=> [[...]]


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 
A

Arun Kumar

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

Hello David,

Thanks for the answer.

But would you know why it is so? Is there something syntactic or semantic
issue that I am making,

the reason i ask this is...

n = 10
x += n
does a perfect x = nil + n => n initialization, which is good and
explainable.

In the array case however,
One would expect [atleast i am :) ] the elements of the source array [if
any] be appended to the target. Now why is the reference going in making it
a recursive :?

sorry if this question is lame or bozo but i feel a clear behaviour enables
clear understanding or would require even more clearer reasoning.

Cheers
Arun

Hi --


On Fri, 2 May 2008, Arun Kumar wrote:

Hi all,
I am beginning to learn ruby and cant seem to reason this behaviour. I
expect since empty or nill is the array, arr*n shouldnt change it.

Why is this behaviour so?

Code:

num_arr = Array.new
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"
puts "Num Alpha: #{num_arr << num_arr} and size: #{num_arr.size}"
num_arr.insert(-1, num_arr << num_arr)
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"

Output:

Num Alpha: and size: 0
Num Alpha: [...] and size: 1
Num Alpha: [...][...][...][...][...][...][...][...][...] and size: 3

You're inserting an array into itself. Ruby represents that kind of
recursive inclusion with dots.

irb(main):005:0> a = []
=> []
irb(main):006:0> a << a
=> [[...]]


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 
D

David A. Black

Hi --

Hi --


On Fri, 2 May 2008, Arun Kumar wrote:

Hi all,
I am beginning to learn ruby and cant seem to reason this behaviour. I
expect since empty or nill is the array, arr*n shouldnt change it.

Why is this behaviour so?

Code:

num_arr = Array.new
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"
puts "Num Alpha: #{num_arr << num_arr} and size: #{num_arr.size}"
num_arr.insert(-1, num_arr << num_arr)
puts "Num Alpha: #{num_arr} and size: #{num_arr.size}"

Output:

Num Alpha: and size: 0
Num Alpha: [...] and size: 1
Num Alpha: [...][...][...][...][...][...][...][...][...] and size: 3

You're inserting an array into itself. Ruby represents that kind of
recursive inclusion with dots.

irb(main):005:0> a = []
=> []
irb(main):006:0> a << a
=> [[...]]
Hello David,

Thanks for the answer.

But would you know why it is so? Is there something syntactic or semantic
issue that I am making,

the reason i ask this is...

n = 10
x += n
does a perfect x = nil + n => n initialization, which is good and
explainable.

You can't add 10 to nil. You'll get an error if you try to do that,
because nil has no + method.
In the array case however,
One would expect [atleast i am :) ] the elements of the source array [if
any] be appended to the target. Now why is the reference going in making it
a recursive :?

sorry if this question is lame or bozo but i feel a clear behaviour enables
clear understanding or would require even more clearer reasoning.

You've using the << method:

num_arr = Array.new
num_arr << num_arr

which appends the object num_arr (not its elements, but it, itself) to
the object num_arr.

If you want to add the elements of an array to another array, you can
use concat:

irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a.concat(a)
=> [1, 2, 3, 1, 2, 3]

It's all perfectly reasonable -- you just have to know what the
methods you're using actually do :)


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 
A

Arun Kumar

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

And now i do :) thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,204
Messages
2,571,066
Members
47,673
Latest member
MahaliaPal

Latest Threads

Top