Forum: Ruby Another Q: find behavior

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.
C9030f7616a7da0dd3e7bf4987f46f07?d=identicon&s=25 Krekna Mektek (Guest)
on 2006-12-29 17:10
(Received via mailing list)
Hi,

Still learning from the Pickaxe book, and I've got a question about this
code:

class Array
  def find
     for i in 0..size
       value = self[i]
       puts self[i]
       return value if yield(value)
     end
     return nil
   end
 end

[1,3,5,7,9].find {|v| v*v > 30 }

irb(main):369:0> [1,3,5,7,9].find {|v| v*v > 30 }
=> 7


how come it prints only 7, and not also 9?
The loop is not stopping as far as I can see, and 9 times 9 is also
bigger then 30.

Krekna
5d15f83f0e681b138d95f1ec430868fa?d=identicon&s=25 Joey (Guest)
on 2006-12-29 17:24
(Received via mailing list)
Because of the "return value if yield(value)", which returns from the
method
causing the loop to end.

I'm not sure what your really trying to achieve, there already is a
Array#find

j`ey
F3b02532d4cb4855881935c002389213?d=identicon&s=25 Morton Goldberg (Guest)
on 2006-12-29 17:48
(Received via mailing list)
On Dec 29, 2006, at 11:08 AM, Krekna Mektek wrote:

>       return value if yield(value)
>
> how come it prints only 7, and not also 9?
> The loop is not stopping as far as I can see, and 9 times 9 is also
> bigger then 30.

But the loop does stop when it reaches 7. As soon as 'yield(value)'
evaluates to true, the 'return' is executed and both the method and
the loop terminate.

Regards, Morton
C9030f7616a7da0dd3e7bf4987f46f07?d=identicon&s=25 Krekna Mektek (Guest)
on 2006-12-29 17:54
(Received via mailing list)
Ah, so the return exits the loop, now I understand.

@Joey:
What I want to achieve? This is just an example from the book ;)

Krekna

2006/12/29, Morton Goldberg <m_goldberg@ameritech.net>:
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2006-12-29 18:00
(Received via mailing list)
On 29.12.2006 17:08, Krekna Mektek wrote:
> Hi,
>
> Still learning from the Pickaxe book, and I've got a question about this
> code:
>
> class Array
>  def find
>     for i in 0..size

That line should read

for i in 0...size

Otherwise you will always throw nil at your test if it failed for all
elements in the array.

> irb(main):369:0> [1,3,5,7,9].find {|v| v*v > 30 }
> => 7
>
>
> how come it prints only 7, and not also 9?

Because the "return" will immediately make the method exit.

> The loop is not stopping as far as I can see, and 9 times 9 is also
> bigger then 30.

The loop will stop once the first match is found precisely because of
the "return".  Either you tested a different piece of code than you
posted or you overlooked something.

Kind regards

	robert
This topic is locked and can not be replied to.