From: Rick DeNatale Date: 2007-10-03T03:23:11+09:00 Subject: Re: got a range from an array, but looking for other ways of doing it On 9/30/07, SpringFlowers AutumnMoon wrote: > SpringFlowers AutumnMoon wrote: > > Simon Schuster 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) 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/