A google turns up this:
In Ruby, break exits the block with value "nil". The caller must check
after each closure call to see if the value returned was "nil", and
break itself, if necessary. A side effect is that you can't return
"nil" from a block without terminating the calling structure. (As it
happens, this is almost always acceptable.)
Use IRB to figure if indeed the standard methods that accept blocks do
this checking.
contact.each {|c| nb -= 1; exit; if c.from == parameter } # the
second ; is definitely wrong
Perhaps you meant:
contact.each {|c| if c.from == parameter; nb -= 1; break; end }
Well, if each is defined and the Enumerable mixin is mixed in (it
usually is), you get #find for free, so:
$ ri Enumerable#find
-------------------------------------------------------- Enumerable#f
ind
enum.detect(ifnone = nil) {| obj | block } => obj or nil
enum.find(ifnone = nil) {| obj | block } => obj or nil
---------------------------------------------------------------------
---
Passes each entry in _enum_ to _block_. Returns the first for wh
ich
_block_ is not +false+. If no object matches, calls _ifnone_ and
returns its result when it is specified, or returns +nil+
(1..10).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> nil
(1..100).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> 35
So how about:
nb = -1 if contact.find{|c| c.from == parameter }
?
This seems good.
Plug: Have a look at the adopt-a-newbie thread
Aur Saraf