[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

IF test in FOR loop

Josselin

7/8/2006 4:00:00 PM

is it possible to test a condition (true-false) for each element in a
loop like this :

for user in @users (user.has_role? ('manager'))
.....
end

or shoudl I write an if condition inside the loop :

for user in @users
if (user.has_role? ('manager'))
....
end
end

tfyh

joss

3 Answers

Daniel Schierbeck

7/8/2006 4:11:00 PM

0

Josselin wrote:
> is it possible to test a condition (true-false) for each element in a
> loop like this :
>
> for user in @users (user.has_role? ('manager'))
> ....
> end
>
> or shoudl I write an if condition inside the loop :
>
> for user in @users
> if (user.has_role? ('manager'))
> ....
> end
> end

For starters, I would use #each instead of the `for' magic. Second, if
you only wish to process a sub-group of the items, select those first,
and then iterate over them:

@users.select{|user| user.has_role? 'manager'}.each do |user|
# ...
end

It may not be faster, but I think it's easier to read and understand.
You could also split it up, if you prefer:

managers = @users.select{|user| user.has_role? 'manager'}
managers.each{|manager| ...}


Cheers,
Daniel

Yukihiro Matsumoto

7/8/2006 4:33:00 PM

0

Hi,

In message "Re: IF test in FOR loop"
on Sun, 9 Jul 2006 01:05:23 +0900, Josselin <josselin@wanadoo.fr> writes:

|is it possible to test a condition (true-false) for each element in a
|loop like this :
|
|for user in @users (user.has_role? ('manager'))
|....
|end
|
|or shoudl I write an if condition inside the loop :
|
|for user in @users
| if (user.has_role? ('manager'))
| ....
| end
|end

for user in @users
next if user.has_role? ('manager')
....
end

or

@users.select{|user| x.has_role?('manager')}.each do |user|
...
end

or anything you like.

matz.

Jeff Schwab

7/8/2006 4:59:00 PM

0

Josselin wrote:
> is it possible to test a condition (true-false) for each element in a
> loop like this :
>
> for user in @users (user.has_role? ('manager'))
> .....
> end
>
> or shoudl I write an if condition inside the loop :
>
> for user in @users
> if (user.has_role? ('manager'))
> ....
> end
> end

@users.select {|u| u.has_role?('manager')}.each do |u|
# ....
end

Or, if you do this kind of thing a lot, you could define checker classes
for use with grep.

class Role_check
def initialize(role)
@role = role
end
def === (user)
user.has_role?(@role)
end
end

class Check
def Check.for_role(role)
Role_check.new(role)
end
end

users.grep(Check.for_role('manager')) do |u|
# ....
end