# IF test in FOR loop

**URL:** <https://www.ruby-forum.com/t/if-test-in-for-loop/97603>\
**Category:** Ruby\
**Created:** [July 8, 2006, 6:36pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603 "2006-07-08T18:36:52Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Josselin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@Josselin](https://www.ruby-forum.com/u/Josselin)\
**Post date:** [July 8, 2006, 6:36pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603/1 "2006-07-08T18:36:52Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Josselin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@Josselin](https://www.ruby-forum.com/u/Josselin)\
**Post date:** [August 3, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603/2 "2006-08-03T14:24:14Z")

</div>

Josselin wrote:

> ```
> 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

---

<div class="post-metadata">

**Author:** ![Josselin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@Josselin](https://www.ruby-forum.com/u/Josselin)\
**Post date:** [August 3, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603/3 "2006-08-03T14:24:14Z")

</div>

On 7/8/06, Josselin [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> for user in @users  
> if (user.has\_role? (‘manager’))  
> …  
> end  
> end
> 
> tfyh
> 
> joss

You could use  
for user in @users.collect{ |u| u if u.has\_role?(“manager”) }  
stuff  
end

but effectively your iterating over you user collection more than once.  
Once through for the initial collect, then once through whatever was  
found.

There is no conditional statement that I know of to short circuit a loop  
through except to include a conditional inside the loop.

---

<div class="post-metadata">

**Author:** ![Josselin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@Josselin](https://www.ruby-forum.com/u/Josselin)\
**Post date:** [August 3, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603/4 "2006-08-03T14:24:15Z")

</div>

Hi,

In message “Re: IF test in FOR loop”  
on Sun, 9 Jul 2006 01:05:23 +0900, Josselin [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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.

```

---

<div class="post-metadata">

**Author:** ![Josselin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@Josselin](https://www.ruby-forum.com/u/Josselin)\
**Post date:** [August 3, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/if-test-in-for-loop/97603/5 "2006-08-03T14:24:19Z")

</div>

On 7/8/06, Yukihiro M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> |for user in @users (user.has\_role? (‘manager’))
> 
> for user in @users  
> next if user.has\_role? (‘manager’)

I like this one specifically, but try “unless” please 😉

…

> ```
> matz.
> 
> ```

–  
Deux choses sont infinies : l’univers et la bÃªtise humaine ; en ce qui  
concerne l’univers, je n’en ai pas acquis la certitude absolue.

- Albert Einstein
