Another Q: find behavior

K

Krekna Mektek

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
puts self
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
 
M

Morton Goldberg

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
puts self
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.


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
 
K

Krekna Mektek

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 said:
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
puts self
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.


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
 
R

Robert Klemme

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.
value = self
puts self
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?


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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,222
Messages
2,571,137
Members
47,754
Latest member
Armand37T7

Latest Threads

Top