# Got a range from an array, but looking for other ways of doing it

**URL:** <https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951>\
**Category:** Ruby\
**Created:** [September 30, 2007, 10:50pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951 "2007-09-30T22:50:16Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [September 30, 2007, 10:50pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/1 "2007-09-30T22:50:16Z")

</div>

a is an array. I’m trying to chop the first and last third off. or,  
choose only the middle third. can be a rough third.

a.length # 4808  
range = a.length \* 0.3 # 1442.4  
range = range.to\_i # 1442  
rangetop = a.length / 2 + range # 3846  
rangebottom = a.length / 2 - range # 962

a[rangebottom…rangetop].length # 2885

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [September 30, 2007, 11:30pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/2 "2007-09-30T23:30:07Z")

</div>

On 30/09/2007, Simon S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> a is an array. I’m trying to chop the first and last third off. or,  
> choose only the middle third. can be a rough third.
> 
> a.length # 4808  
> range = a.length \* 0.3 # 1442.4  
> range = range.to\_i # 1442  
> rangetop = a.length / 2 + range # 3846  
> rangebottom = a.length / 2 - range # 962
> 
> a[rangebottom…rangetop].length # 2885

irb(main):002:0\> a = Array(1…100)  
=\> [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, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,  
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,  
88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]  
irb(main):003:0\> a[a.length/3,a.length/3]  
=\> [34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,  
50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [September 30, 2007, 11:40pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/3 "2007-09-30T23:40:04Z")

</div>

On 10/1/07, Simon S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 

That’s a very rough third 🙂

arr = (1…100).to\_a  
bot = arr.length/3  
p arr[bot…bot\*2]

[34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,  
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67]

Harry

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [October 1, 2007, 1:08am UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/4 "2007-10-01T01:08:26Z")

</div>

Simon S. wrote:

> a is an array. I’m trying to chop the first and last third off. or,  
> choose only the middle third. can be a rough third.
> 
> a.length # 4808  
> range = a.length \* 0.3 # 1442.4  
> range = range.to\_i # 1442  
> rangetop = a.length / 2 + range # 3846  
> rangebottom = a.length / 2 - range # 962
> 
> a[rangebottom…rangetop].length # 2885

if the size is very big you can also do it inline:

a = Array(1…100)  
==\>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,  
19, 20, 2  
1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,  
39, 40, 4  
1, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,  
59, 60, 6  
1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,  
79, 80, 8  
1, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,  
99, 100]

len = a.length  
==\>100

a[0…len / 3] = nil  
==\>nil

a  
==\>[35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,  
51, 52,  
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,  
71, 72,  
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,  
91, 92,  
93, 94, 95, 96, 97, 98, 99, 100]

a[len / 3…-1] = nil  
==\>nil

a  
==\>[35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,  
51, 52,  
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67]

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [October 1, 2007, 4:56am UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/5 "2007-10-01T04:56:02Z")

</div>

SpringFlowers AutumnMoon wrote:

> Simon S. wrote:
> 
> > a is an array. I’m trying to chop the first and last third off. or,  
> > choose only the middle third. can be a rough third.

that’s strange, if i do

a = Array(1…100)  
==\>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1  
6, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3  
1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 4  
6, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 6  
1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 7  
6, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 9  
1, 92, 93, 94, 95, 96, 97, 98, 99, 100]

a[0…a.size/2] = a[a.size\*2/3…-1] = nil  
==\>nil  
a  
==\>[52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,  
65, 66]

a = Array(1…100)  
==\>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1  
6, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3  
1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 4  
6, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 6  
1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 7  
6, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 9  
1, 92, 93, 94, 95, 96, 97, 98, 99, 100]

a[0…a.size/3] = a[a.size\*2/3…-1] = nil  
==\>nil  
a  
==\>[35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,  
63, 64, 65, 66]

shouldn’t it be a[0…a.size/2] = a[a.size\*2/3…-1] = nil  
really?

because it is equiv to

a[0…a.size/2] = (a[a.size\*2/3…-1] = nil)  
a[0…a.size/2] = (nil)

by the time the Right most got evaluated, the array is roughly 66  
elements, so it should be half the size to be deleted. looks like the  
interpreter precalculate a.size / 2 before the final assignment.

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [October 2, 2007, 8:23pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/6 "2007-10-02T20:23:52Z")

</div>

On 9/30/07, SpringFlowers AutumnMoon [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 4
> 
> a[0…a.size/3] = a[a.size\*2/3…-1] = nil  
> because it is equiv to
> 
> a[0…a.size/2] = (a[a.size\*2/3…-1] = nil)  
> a[0…a.size/2] = (nil)

No it’s not because the leftmost = in the first statement is’nt doing  
what you think it is:

a = Array(1…100) # =\> [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, 58, 59, 60, 61, 62, 63, 64, 65,  
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,  
83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,  
100]

b = a[a.size\*2/3…-1] = nil # =\> nil

a # =\> [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, 58, 59, 60, 61, 62, 63, 64, 65, 66]

qri Array#[]=  
-------------------------------------------------------------- Array#[]=  
array[index] = obj → obj  
array[start, length] = obj or an\_array or nil → obj or an\_array  
or nil  
array[range] = obj or an\_array or nil → obj or an\_array  
or nil

Note that Array#[]= returns its second argument, NOT the resulting  
array.

ALSO

The value of a ruby assignment expression is the right hand side, NOT  
the left hand side.

class Foo  
def a=(b)  
10  
end  
end

f = Foo.new

f.send(:a=, 3) # =\> 10  
b = f.a = 3 # =\> 3

–  
Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

---

<div class="post-metadata">

**Author:** ![simonsaid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b5e925/32.png) [@simonsaid](https://www.ruby-forum.com/u/simonsaid)\
**Post date:** [October 1, 2007, 3:25pm UTC](https://www.ruby-forum.com/t/got-a-range-from-an-array-but-looking-for-other-ways-of-doing-it/115951/7 "2007-10-01T15:25:29Z")

</div>

2007/9/30, Simon S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> a is an array. I’m trying to chop the first and last third off. or,  
> choose only the middle third. can be a rough third.
> 
> a.length # 4808  
> range = a.length \* 0.3 # 1442.4  
> range = range.to\_i # 1442  
> rangetop = a.length / 2 + range # 3846  
> rangebottom = a.length / 2 - range # 962
> 
> a[rangebottom…rangetop].length # 2885

What exactly do you want to do with the slice?

Kind regards

robert
