# How do arrays in Ruby work?

**URL:** <https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851>\
**Category:** Ruby\
**Created:** [March 14, 2009, 3:14pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851 "2009-03-14T15:14:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![woodzer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/f08c70/32.png) [@woodzer](https://www.ruby-forum.com/u/woodzer)\
**Post date:** [March 14, 2009, 3:14pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851/1 "2009-03-14T15:14:54Z")

</div>

As in how they are organized behind the scenes.

For example, if I say

arr = [1, 2, 3, 4]  
arr.slice[1]

Is it going to have to physically relocate everything after 2 in memory?  
Would using a linked list be more efficient if a lot of elements are  
going to be removed and inserted?

---

<div class="post-metadata">

**Author:** ![woodzer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/f08c70/32.png) [@woodzer](https://www.ruby-forum.com/u/woodzer)\
**Post date:** [March 14, 2009, 3:41pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851/2 "2009-03-14T15:41:32Z")

</div>

slice only returns the value within the range or at index but does not  
modify the original array. slice![1] would effectively remove value at  
index  
1 from arr.  
I don’t know how it is implemented.

---

<div class="post-metadata">

**Author:** ![woodzer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/f08c70/32.png) [@woodzer](https://www.ruby-forum.com/u/woodzer)\
**Post date:** [March 14, 2009, 3:47pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851/3 "2009-03-14T15:47:24Z")

</div>

On Sat, Mar 14, 2009 at 10:12 AM, Peter Wu [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> As in how they are organized behind the scenes.
> 
> For example, if I say
> 
> arr = [1, 2, 3, 4]  
> arr.slice[1]

I think you meant either

arr.slice(1)  
or  
arr[1]

arr.slice[1] won’t work since slice requires arguments, and this is  
being  
interpreted as  
(arr.slice)[1]

> Is it going to have to physically relocate everything after 2 in memory?  
> Would using a linked list be more efficient if a lot of elements are  
> going to be removed and inserted?

So far we haven’t done anything which would add or remove anything

arr.slice(1) simply returns a reference to the object in the second  
element  
of arr. arr is untouched

arr.slice(1,3) would return an array containing the second, third and  
fourth  
elements, the original array would be untouched. AND

The MRI ruby implementation of arrays uses a copy on write scheme, so  
that  
both arr and the returned object would actually share memory for the  
array  
of references. If one or the other changed then a copy would be  
triggered.

Ruby arrays are implemented rather efficiently both in terms of space  
and  
speed. It’s usually best to use them simply and only worry about  
performance  
issues when they arise, and when they do, it will probably be something  
other than “I should have used a linked list instead of an array”

–  
Rick DeNatale

Blog: [http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [http://www.workingwithrails.com/person/9021-rick-denatale](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)

---

<div class="post-metadata">

**Author:** ![woodzer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/f08c70/32.png) [@woodzer](https://www.ruby-forum.com/u/woodzer)\
**Post date:** [March 14, 2009, 5:57pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851/4 "2009-03-14T17:57:17Z")

</div>

Rick Denatale wrote:

> So far we haven’t done anything which would add or remove anything
> 
> arr.slice(1) simply returns a reference to the object in the second  
> element  
> of arr. arr is untouched
> 
> arr.slice(1,3) would return an array containing the second, third and  
> fourth  
> elements, the original array would be untouched.

That’s my mistake, arr.slice!(1) was the intention. But I see what  
you’re saying.

---

<div class="post-metadata">

**Author:** ![woodzer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/f08c70/32.png) [@woodzer](https://www.ruby-forum.com/u/woodzer)\
**Post date:** [March 15, 2009, 1:35pm UTC](https://www.ruby-forum.com/t/how-do-arrays-in-ruby-work/162851/5 "2009-03-15T13:35:43Z")

</div>

On Mar 14, 2:12 pm, Peter Wu [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> –  
> Posted viahttp://www.ruby-forum.com/.

if you have the array a = [1,2,3,4,5]

b = a.slice!(0,3)  
will end up with a == [4,5] and b == [1,2,3]

b = a.slice(0,3)  
will end up with a == [1,2,3,4,5] and b == [1,2,3]

for the last one you can also use b = a[0…2] , you will get the same  
result
