Special variable within iterators to hold results?

W

Wes Gamble

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
 
E

Eero Saynatkari

--QKpLca3blcvhMJ0W
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

I have this:
=20
FILTER_COLUMNS =3D Array.new
DISPLAYABLE_COLUMNS.each do |field_array|
FILTER_COLUMNS << [ field_array[1], field_array[0] ]
end
=20
Is there any way to write this so that it could look something like:
=20
FILTER_COLUMNS =3D DISPLAYABLE_COLUMNS.each do |field_array|
??? << [ field_array[1], field_array[0] ]
end

Take a look at Enumerable, specifically #inject.


--QKpLca3blcvhMJ0W
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (FreeBSD)

iD8DBQFFIUOI7Nh7RM4TrhIRAmHeAKDxbGP9ataNwmYlVnZO7NHMvuNvLACfTK63
iP6+bmciThSyRV4yc7gkRpo=
=J6qC
-----END PGP SIGNATURE-----

--QKpLca3blcvhMJ0W--
 
L

Logan Capaldo

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. )
 
R

Rick DeNatale

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/

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

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

Rick DeNatale

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([] {|

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]]}
 
R

Rick DeNatale

On 10/2/06, Rick DeNatale <[email protected]> wrote:

Okay, one last try
or assuming that field_array contains two element arrays:

displayable_columns.inject([]) {|result, field_array| result <<
field_array.reverse}
--
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/
 
T

Timothy Goddard

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]
 
D

dblack

Hi --

Wes said:
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 | (e-mail address removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
 
C

Caleb Clausen

I like this way:

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

Wes Gamble

Timothy said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,046
Latest member
Gavizuho

Latest Threads

Top