Array element access

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

···

--
Posted via http://www.ruby-forum.com/.

require 'enumerator'
a = (1..10).to_a
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

-- Daniel

···

On Mar 12, 2006, at 9:34 PM, Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

--
Posted via http://www.ruby-forum.com/\.

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

# This is ugly, but it works:

a = [1,2,3,4,5,6]
(1..a.length).step(2) { |i| puts a[i] }

# -Harold

array.inject(false) do |alternate,element|
  if alternate
     # Your processing
  end
  !alternate
end

···

On 3/12/06, Tomas Fischer <tomas_fischer99_spamremoveit_@yahoo.com> wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

--
Posted via http://www.ruby-forum.com/\.

irb(main):001:0> a = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):002:0> a.select {|e| a.index(e) % 2 == 1 }
=> [2, 4, 6]

···

On 12 mars 06, at 21:34, Tomas Fischer wrote:

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

--
Luc Heinrich - luc@honk-honk.com - http://www.honk-honk.com

Fixnum#step is one of the easiest ways to do this:

   harp:~ > cat a.rb
   a = [1, 2, 3, 4, 5, 6]
   1.step(a.size, 2){|i| p a[i]}

   harp:~ > ruby a.rb
   2
   4
   6

regards.

-a

···

On Mon, 13 Mar 2006, Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

--
share your knowledge. it's a way to achieve immortality.
- h.h. the 14th dali lama

Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there is a "ruby way" of doing this.

Thanks.
tomas

I've always been intrigued by creating a generalized enumeration system. Have you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing index inside map. For example:

(1..10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do this:

file.collect.each_byte.with_index { |b, i| b + 1 }

Mike

Daniel Harple wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

--
Posted via http://www.ruby-forum.com/\.

require 'enumerator'
a = (1..10).to_a
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

-- Daniel

enumerator is handy but it seems a bit like overkill for a task that can be done with the builtin classes:

irb(main):009:0> ary = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):010:0> ary2 =
=>
irb(main):011:0> ary.each_with_index { |a, i| ary2 << a if i % 2 == 1 }
=> [1, 2, 3, 4, 5, 6]
irb(main):012:0> ary2
=> [2, 4, 6]

···

On Mar 12, 2006, at 9:34 PM, Tomas Fischer wrote:

Daniel Harple wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a "ruby way" of doing this.

Thanks.
tomas

--Posted via http://www.ruby-forum.com/\.

require 'enumerator'
a = (1..10).to_a
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

-- Daniel

I might do it this way:

map , = (1..10).partition{|i| i%2==0}
map.each {|i| puts a[i]}

or this way

a.each_with_index {|a,i| if i%2 == 0; ... ; end}

Depending on my needs and mood

···

On Mar 12, 2006, at 9:34 PM, Tomas Fischer wrote:

Daniel Harple wrote:

···

On Mar 12, 2006, at 9:34 PM, Tomas Fischer wrote:

> Hi,
>
> I've got an array a= [1,2,3,4,5,6] and want to access each second
> element:
> b=[2,4,6]. How is this done in ruby?
>
> I know, that I can use a for-loob and modulo operator, but I think
> there
> is a "ruby way" of doing this.
>
> Thanks.
> tomas
>
> --
> Posted via http://www.ruby-forum.com/\.
>

require 'enumerator'
a = (1..10).to_a
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

-- Daniel

f=1
[1,2,3,4,5,6].select{f=!f}.each{|x|p x}

That's a problem if there are duplicates in the array:

irb(main):012:0> a=[1,1,2,2,3,3,4,5]
=> [1, 1, 2, 2, 3, 3, 4, 5]
irb(main):013:0> a.select{|e| a.index(e) %2 == 1}
=> [5]
irb(main):014:0> s=true
=> true
irb(main):015:0> a.select{s=!s}
=> [1, 2, 3, 5]
irb(main):016:0>

-Adam

···

On 3/12/06, Luc Heinrich <luc@honk-honk.com> wrote:

On 12 mars 06, at 21:34, Tomas Fischer wrote:

> I've got an array a= [1,2,3,4,5,6] and want to access each second
> element:
> b=[2,4,6]. How is this done in ruby?

irb(main):001:0> a = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):002:0> a.select {|e| a.index(e) % 2 == 1 }
=> [2, 4, 6]

--

Hi --

Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there is a "ruby way" of doing this.

Thanks.
tomas

I've always been intrigued by creating a generalized enumeration system. Have you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing index inside map. For example:

(1..10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do this:

file.collect.each_byte.with_index { |b, i| b + 1 }

I'm not sure why, but to my eye this has always looked somewhat
obscure. I guess it's something about having to read to the right,
even to the extent of not seeing a block, before I know what's being
returned (array vs. enumerator). It's almost as if the call to
collect wasn't a "real" call to collect, but rather a kind of
place-holder for a collect operation. I'm not sure.

David

···

On Tue, 14 Mar 2006, Mike Austin wrote:

--
David A. Black (dblack@wobblini.net)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! Ruby for Rails

Yep, good catch.

···

On 13 mars 06, at 01:00, Adam Shelly wrote:

That's a problem if there are duplicates in the array:

--
Luc Heinrich - luc@honk-honk.com - http://www.honk-honk.com

dblack@wobblini.net wrote:

Hi --

Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there is a "ruby way" of doing this.

Thanks.
tomas

I've always been intrigued by creating a generalized enumeration system. Have you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing index inside map. For example:

(1..10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do this:

file.collect.each_byte.with_index { |b, i| b + 1 }

I'm not sure why, but to my eye this has always looked somewhat
obscure. I guess it's something about having to read to the right,
even to the extent of not seeing a block, before I know what's being
returned (array vs. enumerator). It's almost as if the call to
collect wasn't a "real" call to collect, but rather a kind of
place-holder for a collect operation. I'm not sure.

Ok, what if you rearrange the order of the calls:

file.each_byte.with_index.collect { |b, i| b + 1 }

That's more left-to-right object-oriented sounding. Come to think of it I like this better because now collect is at the end, and that is the the final intent (with the block being next to it).

Mike

···

On Tue, 14 Mar 2006, Mike Austin wrote:

Hi --

···

On Tue, 14 Mar 2006, Mike Austin wrote:

dblack@wobblini.net wrote:

Hi --

On Tue, 14 Mar 2006, Mike Austin wrote:

Tomas Fischer wrote:

Hi,

I've got an array a= [1,2,3,4,5,6] and want to access each second element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there is a "ruby way" of doing this.

Thanks.
tomas

I've always been intrigued by creating a generalized enumeration system. Have you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing index inside map. For example:

(1..10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do this:

file.collect.each_byte.with_index { |b, i| b + 1 }

I'm not sure why, but to my eye this has always looked somewhat
obscure. I guess it's something about having to read to the right,
even to the extent of not seeing a block, before I know what's being
returned (array vs. enumerator). It's almost as if the call to
collect wasn't a "real" call to collect, but rather a kind of
place-holder for a collect operation. I'm not sure.

Ok, what if you rearrange the order of the calls:

file.each_byte.with_index.collect { |b, i| b + 1 }

That's more left-to-right object-oriented sounding. Come to think of it I like this better because now collect is at the end, and that is the the final intent (with the block being next to it).

There's still something I don't like about using method-chaining
syntax for this. It may just be a failure of imagination on my part.

David

--
David A. Black (dblack@wobblini.net)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! http://www.manning.com/books/black