Special variable within iterators to hold results?

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

so that I don't have to bother initializing FILTER_COLUMNS - is there
some special variable that holds the intermediate result of the iterator
body?

Or perhaps an appropriate call to collect?

Thanks,
Wes

···

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

Take a look at Enumerable, specifically #inject.

···

On 2006.10.03 01:45, Wes Gamble wrote:

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

so that I don't have to bother initializing FILTER_COLUMNS - is there
some special variable that holds the intermediate result of the iterator
body?

Or perhaps an appropriate call to collect?

That would work:
FILTER_COLUMNS = DISPLAYABLE_COLUMNS.collect { |field_array| [field_array[1],
field_array[0] }

Note you can also do something like:

filter_cols = disp_cols.map { |a, b, *_| [b, a] }

( map and collect are aliases of each other. )

···

On Tue, Oct 03, 2006 at 01:45:19AM +0900, Wes Gamble wrote:

Thanks,
Wes

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

filter_columns = displayable_columns.inject( {|

···

On 10/2/06, Wes Gamble <weyus@att.net> wrote:

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

so that I don't have to bother initializing FILTER_COLUMNS - is there
some special variable that holds the intermediate result of the iterator
body?

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/

Firstly, you shouldn't capitalize your variables like that. Ruby will
treat any variable with a capital first letter as a constant - it will
behave differently.

A better implementation would be:

filter_columns = displayable_columns.map {|field_array|
[field_array[1], field_array[0]]

or

filter_columns = displayable_columns.map {|field_array|
field_array[0,2].reverse]

Wes Gamble wrote:

···

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

so that I don't have to bother initializing FILTER_COLUMNS - is there
some special variable that holds the intermediate result of the iterator
body?

Or perhaps an appropriate call to collect?

Thanks,
Wes

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

darn that itchy trigger finger.

displayable_columns.inject() {|result, field_array| result <<
[field_array[1], field_array[0]]}

or assuming that field_array contains two element arrays:

displayable_columns.inject() {|result, field_array| result <<
[field_array[1], field_array[0]]}

···

On 10/2/06, Rick DeNatale <rick.denatale@gmail.com> wrote:

On 10/2/06, Wes Gamble <weyus@att.net> wrote:
> I have this:
>
> FILTER_COLUMNS = Array.new
> DISPLAYABLE_COLUMNS.each do |field_array|
> FILTER_COLUMNS << [ field_array[1], field_array[0] ]
> end
>
> Is there any way to write this so that it could look something like:
>
> FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
> ??? << [ field_array[1], field_array[0] ]
> end
>
> so that I don't have to bother initializing FILTER_COLUMNS - is there
> some special variable that holds the intermediate result of the iterator
> body?

filter_columns = displayable_columns.inject( {|

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Hi --

···

On Wed, 4 Oct 2006, Timothy Goddard wrote:

Wes Gamble wrote:

I have this:

FILTER_COLUMNS = Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
  FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end

Is there any way to write this so that it could look something like:

FILTER_COLUMNS = DISPLAYABLE_COLUMNS.each do |field_array|
  ??? << [ field_array[1], field_array[0] ]
end

so that I don't have to bother initializing FILTER_COLUMNS - is there
some special variable that holds the intermediate result of the iterator
body?

Or perhaps an appropriate call to collect?

Firstly, you shouldn't capitalize your variables like that. Ruby will
treat any variable with a capital first letter as a constant - it will
behave differently.

A better implementation would be:

filter_columns = displayable_columns.map {|field_array|
[field_array[1], field_array[0]]

or

filter_columns = displayable_columns.map {|field_array|
field_array[0,2].reverse]

You could also do:

   filter_columns = displayable_columns.map {|field_array|
     field_array.values_at(1,0) }

David

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

Timothy Goddard wrote:

Firstly, you shouldn't capitalize your variables like that. Ruby will
treat any variable with a capital first letter as a constant - it will
behave differently.

Who said it wasn't a constant ;)? It's a set of static lookup data to
drive an options array for a SELECT form element in Rails.

Thanks for looking out for me though.

Wes

···

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

Okay, one last try

or assuming that field_array contains two element arrays:

displayable_columns.inject() {|result, field_array| result <<
field_array.reverse}

···

On 10/2/06, Rick DeNatale <rick.denatale@gmail.com> wrote:

On 10/2/06, Rick DeNatale <rick.denatale@gmail.com> wrote:

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/

I like this way:

filter_columns = displayable_columns.map {|(a,b)| [b,a] }

Caleb Clausen wrote:

I like this way:

filter_columns = displayable_columns.map {|(a,b)| [b,a] }

Nice! That wins! :slight_smile:

Thanks,
Wes

···

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