Forum: Ruby exit in a bloc DRY way...

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Josselin (Guest)
on 2007-02-18 13:45
(Received via mailing list)
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
Sharon P. (Guest)
on 2007-02-18 14:03
(Received via mailing list)
Hi,

I think this should do the job
nb-=1 if contact.select{|c| c==parameter}.any?

it will return nb-1 if any contact matches parameter, or nil if none
match

cheers,
Dave
SonOfLilit (Guest)
on 2007-02-18 14:06
(Received via mailing list)
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 S.
SonOfLilit (Guest)
on 2007-02-18 14:07
(Received via mailing list)
Isn't #find better than #select?

select wouldn't break the first time a match was found, find would.
Less time, less memory.

Aur S.
George O. (Guest)
on 2007-02-18 14:18
(Received via mailing list)
On 2/18/07, SonOfLilit <removed_email_address@domain.invalid> wrote:
> > cheers,
> > Dave
> Isn't #find better than #select?
>
> select wouldn't break the first time a match was found, find would.
> Less time, less memory.
>
> Aur S.

I'd do:

  nb-=1 if contact.any?{|c| c.from==parameter}

Regards,
George.
Sharon P. (Guest)
on 2007-02-18 14:21
(Received via mailing list)
> Isn't #find better than #select?

Yes, I think you are correct.
I am learning too and had not come across find before. Thankyou for
the information.

Cheers,
Dave
SonOfLilit (Guest)
on 2007-02-18 14:26
(Received via mailing list)
On 2/18/07, George O. <removed_email_address@domain.invalid> wrote:
> I'd do:
>
>   nb-=1 if contact.any?{|c| c.from==parameter}
>
> Regards,
> George.
>
>

Wow, #any? can do this? Thanks for teaching me a cool idiom!



On 2/18/07, Sharon P. <removed_email_address@domain.invalid> wrote:
> Yes, I think you are correct.
> I am learning too and had not come across find before. Thankyou for
> the information.
>
> Cheers,
> Dave

Then let me repeat that plug: Check out the adopt-a-newbie thread please
:)

Aur S.
Josselin (Guest)
on 2007-02-18 14:45
(Received via mailing list)
On 2007-02-18 13:05:29 +0100, SonOfLilit <removed_email_address@domain.invalid> 
said:

>
> $ ri Enumerable#find
>
>
>>            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
SonOfLilit (Guest)
on 2007-02-18 15:16
(Received via mailing list)
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 S.
This topic is locked and can not be replied to.