From: SonOfLilit Date: 2007-02-18T22:15:50+09:00 Subject: Re: exit in a bloc DRY way... Here in the list. How do you read the list? Myself, I'm subscribed to it in my gmail account and have it all in a label, so for me it's simply in the first page. If you can't find it, google for ruby adopt-a-newbie. Aur Saraf On 2/18/07, Josselin wrote: > On 2007-02-18 13:05:29 +0100, SonOfLilit said: > > > 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 > > > > On 2/18/07, Josselin wrote: > >> I wrote this code that's running well.. > >> origin = false > >> contact.each {|c| origin = true if c.from == parameter } > >> nb -= 1 if origin > >> > >> is there any way to write it in one line ? (exiting from the bloc when > >> the condition is true) > >> something like : > >> contact.each {|c| nb -= 1; exit; if c.from == parameter } > >> > >> tfyl > >> > >> joss > > thanks a lot !! I love Ruby for that.... start from one point .. and > logically go to the DRY way... with > Rubist help.... > > where is this thread 'adopt a newbie' .... ? > > joss > > >