Another Q: find behavior


#1

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


#2

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


#3

On Dec 29, 2006, at 11:08 AM, Krekna M. 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


#4

Ah, so the return exits the loop, now I understand.

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

Krekna

2006/12/29, Morton G. removed_email_address@domain.invalid:


#5

On 29.12.2006 17:08, Krekna M. 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